From 46badca07e26247454bfd740a3f73e48f04a4676 Mon Sep 17 00:00:00 2001 From: "Frederick F. Kautz IV" Date: Fri, 3 Apr 2015 20:40:21 -0700 Subject: [PATCH] Removing Godeps from pkg/api --- pkg/api/Godeps/Godeps.json | 41 - pkg/api/Godeps/Readme | 5 - pkg/api/Godeps/_workspace/.gitignore | 2 - .../github.com/gorilla/context/.travis.yml | 7 - .../src/github.com/gorilla/context/LICENSE | 27 - .../src/github.com/gorilla/context/README.md | 7 - .../src/github.com/gorilla/context/context.go | 143 - .../gorilla/context/context_test.go | 161 - .../src/github.com/gorilla/context/doc.go | 82 - .../src/github.com/gorilla/mux/.travis.yml | 7 - .../src/github.com/gorilla/mux/LICENSE | 27 - .../src/github.com/gorilla/mux/README.md | 7 - .../src/github.com/gorilla/mux/bench_test.go | 21 - .../src/github.com/gorilla/mux/doc.go | 199 - .../src/github.com/gorilla/mux/mux.go | 353 - .../src/github.com/gorilla/mux/mux_test.go | 943 --- .../src/github.com/gorilla/mux/old_test.go | 714 -- .../src/github.com/gorilla/mux/regexp.go | 276 - .../src/github.com/gorilla/mux/route.go | 524 -- .../github.com/minio-io/erasure/.gitignore | 6 - .../github.com/minio-io/erasure/BUILDDEPS.md | 80 - .../minio-io/erasure/CONTRIBUTING.md | 30 - .../github.com/minio-io/erasure/LICENSE.INTEL | 26 - .../github.com/minio-io/erasure/LICENSE.MINIO | 202 - .../src/github.com/minio-io/erasure/README.md | 25 - .../minio-io/erasure/RELEASE-NOTES.INTEL | 49 - .../minio-io/erasure/RELEASE-NOTES.MINIO | 3 - .../minio-io/erasure/cauchy_test.go | 71 - .../src/github.com/minio-io/erasure/ctypes.go | 59 - .../src/github.com/minio-io/erasure/doc.go | 67 - .../erasure/docs/isa-l_open_src_2.10.pdf | 5429 -------------- .../erasure/docs/isa-l_open_src_2.13.pdf | Bin 270361 -> 0 bytes .../src/github.com/minio-io/erasure/ec_base.c | 348 - .../src/github.com/minio-io/erasure/ec_base.h | 6680 ----------------- .../src/github.com/minio-io/erasure/ec_code.h | 933 --- .../minio-io/erasure/ec_highlevel_func.c | 267 - .../github.com/minio-io/erasure/ec_isal-l.h | 41 - .../minio-io/erasure/ec_minio_common.h | 39 - .../minio-io/erasure/ec_minio_decode.c | 134 - .../minio-io/erasure/ec_minio_encode.c | 59 - .../minio-io/erasure/ec_multibinary.asm | 462 -- .../minio-io/erasure/ec_reg_sizes.asm | 96 - .../github.com/minio-io/erasure/ec_types.h | 80 - .../minio-io/erasure/erasure_decode.go | 122 - .../minio-io/erasure/erasure_encode.go | 197 - .../minio-io/erasure/erasure_yasm_darwin.go | 43 - .../minio-io/erasure/erasure_yasm_linux.go | 43 - .../minio-io/erasure/erasure_yasm_windows.go | 43 - .../erasure/gf_2vect_dot_prod_avx.asm | 381 - .../erasure/gf_2vect_dot_prod_avx2.asm | 398 - .../erasure/gf_2vect_dot_prod_sse.asm | 383 - .../minio-io/erasure/gf_2vect_mad_avx.asm | 264 - .../minio-io/erasure/gf_2vect_mad_avx2.asm | 280 - .../minio-io/erasure/gf_2vect_mad_sse.asm | 267 - .../erasure/gf_3vect_dot_prod_avx.asm | 421 -- .../erasure/gf_3vect_dot_prod_avx2.asm | 441 -- .../erasure/gf_3vect_dot_prod_sse.asm | 422 -- .../minio-io/erasure/gf_3vect_mad_avx.asm | 315 - .../minio-io/erasure/gf_3vect_mad_avx2.asm | 347 - .../minio-io/erasure/gf_3vect_mad_sse.asm | 326 - .../erasure/gf_4vect_dot_prod_avx.asm | 489 -- .../erasure/gf_4vect_dot_prod_avx2.asm | 510 -- .../erasure/gf_4vect_dot_prod_sse.asm | 491 -- .../minio-io/erasure/gf_4vect_mad_avx.asm | 370 - .../minio-io/erasure/gf_4vect_mad_avx2.asm | 371 - .../minio-io/erasure/gf_4vect_mad_sse.asm | 375 - .../erasure/gf_5vect_dot_prod_avx.asm | 348 - .../erasure/gf_5vect_dot_prod_avx2.asm | 362 - .../erasure/gf_5vect_dot_prod_sse.asm | 349 - .../minio-io/erasure/gf_5vect_mad_avx.asm | 401 - .../minio-io/erasure/gf_5vect_mad_avx2.asm | 393 - .../minio-io/erasure/gf_5vect_mad_sse.asm | 409 - .../erasure/gf_6vect_dot_prod_avx.asm | 360 - .../erasure/gf_6vect_dot_prod_avx2.asm | 373 - .../erasure/gf_6vect_dot_prod_sse.asm | 360 - .../minio-io/erasure/gf_6vect_mad_avx.asm | 433 -- .../minio-io/erasure/gf_6vect_mad_avx2.asm | 435 -- .../minio-io/erasure/gf_6vect_mad_sse.asm | 446 -- .../minio-io/erasure/gf_vect_dot_prod_avx.asm | 303 - .../erasure/gf_vect_dot_prod_avx2.asm | 315 - .../minio-io/erasure/gf_vect_dot_prod_sse.asm | 303 - .../minio-io/erasure/gf_vect_mad_avx.asm | 223 - .../minio-io/erasure/gf_vect_mad_avx2.asm | 233 - .../minio-io/erasure/gf_vect_mad_sse.asm | 224 - .../github.com/minio-io/erasure/gf_vect_mul.h | 148 - .../minio-io/erasure/gf_vect_mul_avx.asm | 189 - .../minio-io/erasure/gf_vect_mul_sse.asm | 195 - .../src/github.com/minio-io/erasure/stdint.go | 38 - .../minio-io/erasure/vandermonde_test.go | 66 - .../src/github.com/minio-io/iodine/.gitignore | 24 - .../src/github.com/minio-io/iodine/LICENSE | 202 - .../src/github.com/minio-io/iodine/README.md | 2 - .../src/github.com/minio-io/iodine/iodine.go | 201 - .../github.com/minio-io/iodine/iodine_test.go | 97 - .../src/github.com/stretchr/objx/.gitignore | 22 - .../src/github.com/stretchr/objx/LICENSE.md | 23 - .../src/github.com/stretchr/objx/README.md | 3 - .../src/github.com/stretchr/objx/accessors.go | 179 - .../stretchr/objx/accessors_test.go | 145 - .../stretchr/objx/codegen/array-access.txt | 14 - .../stretchr/objx/codegen/index.html | 86 - .../stretchr/objx/codegen/template.txt | 286 - .../stretchr/objx/codegen/types_list.txt | 20 - .../src/github.com/stretchr/objx/constants.go | 13 - .../github.com/stretchr/objx/conversions.go | 117 - .../stretchr/objx/conversions_test.go | 94 - .../src/github.com/stretchr/objx/doc.go | 72 - .../github.com/stretchr/objx/fixture_test.go | 98 - .../src/github.com/stretchr/objx/map.go | 222 - .../github.com/stretchr/objx/map_for_test.go | 10 - .../src/github.com/stretchr/objx/map_test.go | 147 - .../src/github.com/stretchr/objx/mutations.go | 81 - .../stretchr/objx/mutations_test.go | 77 - .../src/github.com/stretchr/objx/security.go | 14 - .../github.com/stretchr/objx/security_test.go | 12 - .../stretchr/objx/simple_example_test.go | 41 - .../src/github.com/stretchr/objx/tests.go | 17 - .../github.com/stretchr/objx/tests_test.go | 24 - .../stretchr/objx/type_specific_codegen.go | 2881 ------- .../objx/type_specific_codegen_test.go | 2867 ------- .../src/github.com/stretchr/objx/value.go | 13 - .../github.com/stretchr/objx/value_test.go | 1 - .../stretchr/testify/assert/assertions.go | 805 -- .../testify/assert/assertions_test.go | 768 -- .../github.com/stretchr/testify/assert/doc.go | 150 - .../stretchr/testify/assert/errors.go | 10 - .../testify/assert/forward_assertions.go | 262 - .../testify/assert/forward_assertions_test.go | 526 -- .../testify/assert/http_assertions.go | 157 - .../testify/assert/http_assertions_test.go | 86 - .../github.com/stretchr/testify/mock/doc.go | 43 - .../github.com/stretchr/testify/mock/mock.go | 510 -- .../stretchr/testify/mock/mock_test.go | 669 -- .../src/gopkg.in/check.v1/.gitignore | 4 - .../_workspace/src/gopkg.in/check.v1/LICENSE | 25 - .../src/gopkg.in/check.v1/README.md | 20 - .../_workspace/src/gopkg.in/check.v1/TODO | 2 - .../src/gopkg.in/check.v1/benchmark.go | 163 - .../src/gopkg.in/check.v1/benchmark_test.go | 91 - .../src/gopkg.in/check.v1/bootstrap_test.go | 82 - .../_workspace/src/gopkg.in/check.v1/check.go | 945 --- .../src/gopkg.in/check.v1/check_test.go | 207 - .../src/gopkg.in/check.v1/checkers.go | 458 -- .../src/gopkg.in/check.v1/checkers_test.go | 272 - .../src/gopkg.in/check.v1/export_test.go | 9 - .../src/gopkg.in/check.v1/fixture_test.go | 484 -- .../src/gopkg.in/check.v1/foundation_test.go | 335 - .../src/gopkg.in/check.v1/helpers.go | 231 - .../src/gopkg.in/check.v1/helpers_test.go | 519 -- .../src/gopkg.in/check.v1/printer.go | 168 - .../src/gopkg.in/check.v1/printer_test.go | 104 - .../_workspace/src/gopkg.in/check.v1/run.go | 175 - .../src/gopkg.in/check.v1/run_test.go | 419 -- 153 files changed, 49741 deletions(-) delete mode 100644 pkg/api/Godeps/Godeps.json delete mode 100644 pkg/api/Godeps/Readme delete mode 100644 pkg/api/Godeps/_workspace/.gitignore delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/.travis.yml delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/LICENSE delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/context/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/.travis.yml delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/LICENSE delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/bench_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/old_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/regexp.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/route.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/.gitignore delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/BUILDDEPS.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/CONTRIBUTING.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.INTEL delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.MINIO delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.INTEL delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.MINIO delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/cauchy_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ctypes.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.10.pdf delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.13.pdf delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.c delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_code.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_highlevel_func.c delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_isal-l.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_common.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_decode.c delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_encode.c delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_multibinary.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_reg_sizes.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_types.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_decode.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_encode.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_darwin.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_linux.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_windows.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx2.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul.h delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_avx.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_sse.asm delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/stdint.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/vandermonde_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/.gitignore delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/LICENSE delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/.gitignore delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/LICENSE.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/array-access.txt delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/index.html delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/template.txt delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/types_list.txt delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/constants.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/fixture_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_for_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/simple_example_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/errors.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/doc.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock.go delete mode 100644 pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/.gitignore delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/LICENSE delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/README.md delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/TODO delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/bootstrap_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/export_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/fixture_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/foundation_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer_test.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run.go delete mode 100644 pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run_test.go diff --git a/pkg/api/Godeps/Godeps.json b/pkg/api/Godeps/Godeps.json deleted file mode 100644 index 1cd7f813f..000000000 --- a/pkg/api/Godeps/Godeps.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "ImportPath": "github.com/minio-io/minio/pkg/api", - "GoVersion": "go1.4", - "Packages": [ - "./..." - ], - "Deps": [ - { - "ImportPath": "github.com/gorilla/context", - "Rev": "50c25fb3b2b3b3cc724e9b6ac75fb44b3bccd0da" - }, - { - "ImportPath": "github.com/gorilla/mux", - "Rev": "e444e69cbd2e2e3e0749a2f3c717cec491552bbf" - }, - { - "ImportPath": "github.com/minio-io/erasure", - "Rev": "3cece1a107115563682604b1430418e28f65dd80" - }, - { - "ImportPath": "github.com/minio-io/iodine", - "Rev": "55cc4d4256c68fbd6f0775f1a25e37e6a2f6457e" - }, - { - "ImportPath": "github.com/stretchr/objx", - "Rev": "cbeaeb16a013161a98496fad62933b1d21786672" - }, - { - "ImportPath": "github.com/stretchr/testify/assert", - "Rev": "e4ec8152c15fc46bd5056ce65997a07c7d415325" - }, - { - "ImportPath": "github.com/stretchr/testify/mock", - "Rev": "e4ec8152c15fc46bd5056ce65997a07c7d415325" - }, - { - "ImportPath": "gopkg.in/check.v1", - "Rev": "64131543e7896d5bcc6bd5a76287eb75ea96c673" - } - ] -} diff --git a/pkg/api/Godeps/Readme b/pkg/api/Godeps/Readme deleted file mode 100644 index 4cdaa53d5..000000000 --- a/pkg/api/Godeps/Readme +++ /dev/null @@ -1,5 +0,0 @@ -This directory tree is generated automatically by godep. - -Please do not edit. - -See https://github.com/tools/godep for more information. diff --git a/pkg/api/Godeps/_workspace/.gitignore b/pkg/api/Godeps/_workspace/.gitignore deleted file mode 100644 index f037d684e..000000000 --- a/pkg/api/Godeps/_workspace/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/pkg -/bin diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/.travis.yml b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/.travis.yml deleted file mode 100644 index d87d46576..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go - -go: - - 1.0 - - 1.1 - - 1.2 - - tip diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/LICENSE b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/LICENSE deleted file mode 100644 index 0e5fb8728..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/README.md b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/README.md deleted file mode 100644 index c60a31b05..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/README.md +++ /dev/null @@ -1,7 +0,0 @@ -context -======= -[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context) - -gorilla/context is a general purpose registry for global request variables. - -Read the full documentation here: http://www.gorillatoolkit.org/pkg/context diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context.go deleted file mode 100644 index 81cb128b1..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2012 The Gorilla 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 context - -import ( - "net/http" - "sync" - "time" -) - -var ( - mutex sync.RWMutex - data = make(map[*http.Request]map[interface{}]interface{}) - datat = make(map[*http.Request]int64) -) - -// Set stores a value for a given key in a given request. -func Set(r *http.Request, key, val interface{}) { - mutex.Lock() - if data[r] == nil { - data[r] = make(map[interface{}]interface{}) - datat[r] = time.Now().Unix() - } - data[r][key] = val - mutex.Unlock() -} - -// Get returns a value stored for a given key in a given request. -func Get(r *http.Request, key interface{}) interface{} { - mutex.RLock() - if ctx := data[r]; ctx != nil { - value := ctx[key] - mutex.RUnlock() - return value - } - mutex.RUnlock() - return nil -} - -// GetOk returns stored value and presence state like multi-value return of map access. -func GetOk(r *http.Request, key interface{}) (interface{}, bool) { - mutex.RLock() - if _, ok := data[r]; ok { - value, ok := data[r][key] - mutex.RUnlock() - return value, ok - } - mutex.RUnlock() - return nil, false -} - -// GetAll returns all stored values for the request as a map. Nil is returned for invalid requests. -func GetAll(r *http.Request) map[interface{}]interface{} { - mutex.RLock() - if context, ok := data[r]; ok { - result := make(map[interface{}]interface{}, len(context)) - for k, v := range context { - result[k] = v - } - mutex.RUnlock() - return result - } - mutex.RUnlock() - return nil -} - -// GetAllOk returns all stored values for the request as a map and a boolean value that indicates if -// the request was registered. -func GetAllOk(r *http.Request) (map[interface{}]interface{}, bool) { - mutex.RLock() - context, ok := data[r] - result := make(map[interface{}]interface{}, len(context)) - for k, v := range context { - result[k] = v - } - mutex.RUnlock() - return result, ok -} - -// Delete removes a value stored for a given key in a given request. -func Delete(r *http.Request, key interface{}) { - mutex.Lock() - if data[r] != nil { - delete(data[r], key) - } - mutex.Unlock() -} - -// Clear removes all values stored for a given request. -// -// This is usually called by a handler wrapper to clean up request -// variables at the end of a request lifetime. See ClearHandler(). -func Clear(r *http.Request) { - mutex.Lock() - clear(r) - mutex.Unlock() -} - -// clear is Clear without the lock. -func clear(r *http.Request) { - delete(data, r) - delete(datat, r) -} - -// Purge removes request data stored for longer than maxAge, in seconds. -// It returns the amount of requests removed. -// -// If maxAge <= 0, all request data is removed. -// -// This is only used for sanity check: in case context cleaning was not -// properly set some request data can be kept forever, consuming an increasing -// amount of memory. In case this is detected, Purge() must be called -// periodically until the problem is fixed. -func Purge(maxAge int) int { - mutex.Lock() - count := 0 - if maxAge <= 0 { - count = len(data) - data = make(map[*http.Request]map[interface{}]interface{}) - datat = make(map[*http.Request]int64) - } else { - min := time.Now().Unix() - int64(maxAge) - for r := range data { - if datat[r] < min { - clear(r) - count++ - } - } - } - mutex.Unlock() - return count -} - -// ClearHandler wraps an http.Handler and clears request values at the end -// of a request lifetime. -func ClearHandler(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer Clear(r) - h.ServeHTTP(w, r) - }) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context_test.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context_test.go deleted file mode 100644 index 9814c501e..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/context_test.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2012 The Gorilla 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 context - -import ( - "net/http" - "testing" -) - -type keyType int - -const ( - key1 keyType = iota - key2 -) - -func TestContext(t *testing.T) { - assertEqual := func(val interface{}, exp interface{}) { - if val != exp { - t.Errorf("Expected %v, got %v.", exp, val) - } - } - - r, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - emptyR, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - - // Get() - assertEqual(Get(r, key1), nil) - - // Set() - Set(r, key1, "1") - assertEqual(Get(r, key1), "1") - assertEqual(len(data[r]), 1) - - Set(r, key2, "2") - assertEqual(Get(r, key2), "2") - assertEqual(len(data[r]), 2) - - //GetOk - value, ok := GetOk(r, key1) - assertEqual(value, "1") - assertEqual(ok, true) - - value, ok = GetOk(r, "not exists") - assertEqual(value, nil) - assertEqual(ok, false) - - Set(r, "nil value", nil) - value, ok = GetOk(r, "nil value") - assertEqual(value, nil) - assertEqual(ok, true) - - // GetAll() - values := GetAll(r) - assertEqual(len(values), 3) - - // GetAll() for empty request - values = GetAll(emptyR) - if values != nil { - t.Error("GetAll didn't return nil value for invalid request") - } - - // GetAllOk() - values, ok = GetAllOk(r) - assertEqual(len(values), 3) - assertEqual(ok, true) - - // GetAllOk() for empty request - values, ok = GetAllOk(emptyR) - assertEqual(value, nil) - assertEqual(ok, false) - - // Delete() - Delete(r, key1) - assertEqual(Get(r, key1), nil) - assertEqual(len(data[r]), 2) - - Delete(r, key2) - assertEqual(Get(r, key2), nil) - assertEqual(len(data[r]), 1) - - // Clear() - Clear(r) - assertEqual(len(data), 0) -} - -func parallelReader(r *http.Request, key string, iterations int, wait, done chan struct{}) { - <-wait - for i := 0; i < iterations; i++ { - Get(r, key) - } - done <- struct{}{} - -} - -func parallelWriter(r *http.Request, key, value string, iterations int, wait, done chan struct{}) { - <-wait - for i := 0; i < iterations; i++ { - Set(r, key, value) - } - done <- struct{}{} - -} - -func benchmarkMutex(b *testing.B, numReaders, numWriters, iterations int) { - - b.StopTimer() - r, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - done := make(chan struct{}) - b.StartTimer() - - for i := 0; i < b.N; i++ { - wait := make(chan struct{}) - - for i := 0; i < numReaders; i++ { - go parallelReader(r, "test", iterations, wait, done) - } - - for i := 0; i < numWriters; i++ { - go parallelWriter(r, "test", "123", iterations, wait, done) - } - - close(wait) - - for i := 0; i < numReaders+numWriters; i++ { - <-done - } - - } - -} - -func BenchmarkMutexSameReadWrite1(b *testing.B) { - benchmarkMutex(b, 1, 1, 32) -} -func BenchmarkMutexSameReadWrite2(b *testing.B) { - benchmarkMutex(b, 2, 2, 32) -} -func BenchmarkMutexSameReadWrite4(b *testing.B) { - benchmarkMutex(b, 4, 4, 32) -} -func BenchmarkMutex1(b *testing.B) { - benchmarkMutex(b, 2, 8, 32) -} -func BenchmarkMutex2(b *testing.B) { - benchmarkMutex(b, 16, 4, 64) -} -func BenchmarkMutex3(b *testing.B) { - benchmarkMutex(b, 1, 2, 128) -} -func BenchmarkMutex4(b *testing.B) { - benchmarkMutex(b, 128, 32, 256) -} -func BenchmarkMutex5(b *testing.B) { - benchmarkMutex(b, 1024, 2048, 64) -} -func BenchmarkMutex6(b *testing.B) { - benchmarkMutex(b, 2048, 1024, 512) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/doc.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/doc.go deleted file mode 100644 index 73c740031..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/context/doc.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2012 The Gorilla 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 context stores values shared during a request lifetime. - -For example, a router can set variables extracted from the URL and later -application handlers can access those values, or it can be used to store -sessions values to be saved at the end of a request. There are several -others common uses. - -The idea was posted by Brad Fitzpatrick to the go-nuts mailing list: - - http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53 - -Here's the basic usage: first define the keys that you will need. The key -type is interface{} so a key can be of any type that supports equality. -Here we define a key using a custom int type to avoid name collisions: - - package foo - - import ( - "github.com/gorilla/context" - ) - - type key int - - const MyKey key = 0 - -Then set a variable. Variables are bound to an http.Request object, so you -need a request instance to set a value: - - context.Set(r, MyKey, "bar") - -The application can later access the variable using the same key you provided: - - func MyHandler(w http.ResponseWriter, r *http.Request) { - // val is "bar". - val := context.Get(r, foo.MyKey) - - // returns ("bar", true) - val, ok := context.GetOk(r, foo.MyKey) - // ... - } - -And that's all about the basic usage. We discuss some other ideas below. - -Any type can be stored in the context. To enforce a given type, make the key -private and wrap Get() and Set() to accept and return values of a specific -type: - - type key int - - const mykey key = 0 - - // GetMyKey returns a value for this package from the request values. - func GetMyKey(r *http.Request) SomeType { - if rv := context.Get(r, mykey); rv != nil { - return rv.(SomeType) - } - return nil - } - - // SetMyKey sets a value for this package in the request values. - func SetMyKey(r *http.Request, val SomeType) { - context.Set(r, mykey, val) - } - -Variables must be cleared at the end of a request, to remove all values -that were stored. This can be done in an http.Handler, after a request was -served. Just call Clear() passing the request: - - context.Clear(r) - -...or use ClearHandler(), which conveniently wraps an http.Handler to clear -variables at the end of a request lifetime. - -The Routers from the packages gorilla/mux and gorilla/pat call Clear() -so if you are using either of them you don't need to clear the context manually. -*/ -package context diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/.travis.yml b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/.travis.yml deleted file mode 100644 index d87d46576..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go - -go: - - 1.0 - - 1.1 - - 1.2 - - tip diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/LICENSE b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/LICENSE deleted file mode 100644 index 0e5fb8728..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/README.md b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/README.md deleted file mode 100644 index e60301b03..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/README.md +++ /dev/null @@ -1,7 +0,0 @@ -mux -=== -[![Build Status](https://travis-ci.org/gorilla/mux.png?branch=master)](https://travis-ci.org/gorilla/mux) - -gorilla/mux is a powerful URL router and dispatcher. - -Read the full documentation here: http://www.gorillatoolkit.org/pkg/mux diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/bench_test.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/bench_test.go deleted file mode 100644 index c5f97b2b2..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/bench_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2012 The Gorilla 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 mux - -import ( - "net/http" - "testing" -) - -func BenchmarkMux(b *testing.B) { - router := new(Router) - handler := func(w http.ResponseWriter, r *http.Request) {} - router.HandleFunc("/v1/{v1}", handler) - - request, _ := http.NewRequest("GET", "/v1/anything", nil) - for i := 0; i < b.N; i++ { - router.ServeHTTP(nil, request) - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/doc.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/doc.go deleted file mode 100644 index b2deed34c..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/doc.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2012 The Gorilla 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 gorilla/mux implements a request router and dispatcher. - -The name mux stands for "HTTP request multiplexer". Like the standard -http.ServeMux, mux.Router matches incoming requests against a list of -registered routes and calls a handler for the route that matches the URL -or other conditions. The main features are: - - * Requests can be matched based on URL host, path, path prefix, schemes, - header and query values, HTTP methods or using custom matchers. - * URL hosts and paths can have variables with an optional regular - expression. - * Registered URLs can be built, or "reversed", which helps maintaining - references to resources. - * Routes can be used as subrouters: nested routes are only tested if the - parent route matches. This is useful to define groups of routes that - share common conditions like a host, a path prefix or other repeated - attributes. As a bonus, this optimizes request matching. - * It implements the http.Handler interface so it is compatible with the - standard http.ServeMux. - -Let's start registering a couple of URL paths and handlers: - - func main() { - r := mux.NewRouter() - r.HandleFunc("/", HomeHandler) - r.HandleFunc("/products", ProductsHandler) - r.HandleFunc("/articles", ArticlesHandler) - http.Handle("/", r) - } - -Here we register three routes mapping URL paths to handlers. This is -equivalent to how http.HandleFunc() works: if an incoming request URL matches -one of the paths, the corresponding handler is called passing -(http.ResponseWriter, *http.Request) as parameters. - -Paths can have variables. They are defined using the format {name} or -{name:pattern}. If a regular expression pattern is not defined, the matched -variable will be anything until the next slash. For example: - - r := mux.NewRouter() - r.HandleFunc("/products/{key}", ProductHandler) - r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler) - r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler) - -The names are used to create a map of route variables which can be retrieved -calling mux.Vars(): - - vars := mux.Vars(request) - category := vars["category"] - -And this is all you need to know about the basic usage. More advanced options -are explained below. - -Routes can also be restricted to a domain or subdomain. Just define a host -pattern to be matched. They can also have variables: - - r := mux.NewRouter() - // Only matches if domain is "www.domain.com". - r.Host("www.domain.com") - // Matches a dynamic subdomain. - r.Host("{subdomain:[a-z]+}.domain.com") - -There are several other matchers that can be added. To match path prefixes: - - r.PathPrefix("/products/") - -...or HTTP methods: - - r.Methods("GET", "POST") - -...or URL schemes: - - r.Schemes("https") - -...or header values: - - r.Headers("X-Requested-With", "XMLHttpRequest") - -...or query values: - - r.Queries("key", "value") - -...or to use a custom matcher function: - - r.MatcherFunc(func(r *http.Request, rm *RouteMatch) bool { - return r.ProtoMajor == 0 - }) - -...and finally, it is possible to combine several matchers in a single route: - - r.HandleFunc("/products", ProductsHandler). - Host("www.domain.com"). - Methods("GET"). - Schemes("http") - -Setting the same matching conditions again and again can be boring, so we have -a way to group several routes that share the same requirements. -We call it "subrouting". - -For example, let's say we have several URLs that should only match when the -host is "www.domain.com". Create a route for that host and get a "subrouter" -from it: - - r := mux.NewRouter() - s := r.Host("www.domain.com").Subrouter() - -Then register routes in the subrouter: - - s.HandleFunc("/products/", ProductsHandler) - s.HandleFunc("/products/{key}", ProductHandler) - s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) - -The three URL paths we registered above will only be tested if the domain is -"www.domain.com", because the subrouter is tested first. This is not -only convenient, but also optimizes request matching. You can create -subrouters combining any attribute matchers accepted by a route. - -Subrouters can be used to create domain or path "namespaces": you define -subrouters in a central place and then parts of the app can register its -paths relatively to a given subrouter. - -There's one more thing about subroutes. When a subrouter has a path prefix, -the inner routes use it as base for their paths: - - r := mux.NewRouter() - s := r.PathPrefix("/products").Subrouter() - // "/products/" - s.HandleFunc("/", ProductsHandler) - // "/products/{key}/" - s.HandleFunc("/{key}/", ProductHandler) - // "/products/{key}/details" - s.HandleFunc("/{key}/details", ProductDetailsHandler) - -Now let's see how to build registered URLs. - -Routes can be named. All routes that define a name can have their URLs built, -or "reversed". We define a name calling Name() on a route. For example: - - r := mux.NewRouter() - r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler). - Name("article") - -To build a URL, get the route and call the URL() method, passing a sequence of -key/value pairs for the route variables. For the previous route, we would do: - - url, err := r.Get("article").URL("category", "technology", "id", "42") - -...and the result will be a url.URL with the following path: - - "/articles/technology/42" - -This also works for host variables: - - r := mux.NewRouter() - r.Host("{subdomain}.domain.com"). - Path("/articles/{category}/{id:[0-9]+}"). - HandlerFunc(ArticleHandler). - Name("article") - - // url.String() will be "http://news.domain.com/articles/technology/42" - url, err := r.Get("article").URL("subdomain", "news", - "category", "technology", - "id", "42") - -All variables defined in the route are required, and their values must -conform to the corresponding patterns. These requirements guarantee that a -generated URL will always match a registered route -- the only exception is -for explicitly defined "build-only" routes which never match. - -There's also a way to build only the URL host or path for a route: -use the methods URLHost() or URLPath() instead. For the previous route, -we would do: - - // "http://news.domain.com/" - host, err := r.Get("article").URLHost("subdomain", "news") - - // "/articles/technology/42" - path, err := r.Get("article").URLPath("category", "technology", "id", "42") - -And if you use subrouters, host and path defined separately can be built -as well: - - r := mux.NewRouter() - s := r.Host("{subdomain}.domain.com").Subrouter() - s.Path("/articles/{category}/{id:[0-9]+}"). - HandlerFunc(ArticleHandler). - Name("article") - - // "http://news.domain.com/articles/technology/42" - url, err := r.Get("article").URL("subdomain", "news", - "category", "technology", - "id", "42") -*/ -package mux diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux.go deleted file mode 100644 index 5b5f8e7db..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux.go +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright 2012 The Gorilla 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 mux - -import ( - "fmt" - "net/http" - "path" - - "github.com/gorilla/context" -) - -// NewRouter returns a new router instance. -func NewRouter() *Router { - return &Router{namedRoutes: make(map[string]*Route), KeepContext: false} -} - -// Router registers routes to be matched and dispatches a handler. -// -// It implements the http.Handler interface, so it can be registered to serve -// requests: -// -// var router = mux.NewRouter() -// -// func main() { -// http.Handle("/", router) -// } -// -// Or, for Google App Engine, register it in a init() function: -// -// func init() { -// http.Handle("/", router) -// } -// -// This will send all incoming requests to the router. -type Router struct { - // Configurable Handler to be used when no route matches. - NotFoundHandler http.Handler - // Parent route, if this is a subrouter. - parent parentRoute - // Routes to be matched, in order. - routes []*Route - // Routes by name for URL building. - namedRoutes map[string]*Route - // See Router.StrictSlash(). This defines the flag for new routes. - strictSlash bool - // If true, do not clear the request context after handling the request - KeepContext bool -} - -// Match matches registered routes against the request. -func (r *Router) Match(req *http.Request, match *RouteMatch) bool { - for _, route := range r.routes { - if route.Match(req, match) { - return true - } - } - return false -} - -// ServeHTTP dispatches the handler registered in the matched route. -// -// When there is a match, the route variables can be retrieved calling -// mux.Vars(request). -func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { - // Clean path to canonical form and redirect. - if p := cleanPath(req.URL.Path); p != req.URL.Path { - - // Added 3 lines (Philip Schlump) - It was droping the query string and #whatever from query. - // This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue: - // http://code.google.com/p/go/issues/detail?id=5252 - url := *req.URL - url.Path = p - p = url.String() - - w.Header().Set("Location", p) - w.WriteHeader(http.StatusMovedPermanently) - return - } - var match RouteMatch - var handler http.Handler - if r.Match(req, &match) { - handler = match.Handler - setVars(req, match.Vars) - setCurrentRoute(req, match.Route) - } - if handler == nil { - handler = r.NotFoundHandler - if handler == nil { - handler = http.NotFoundHandler() - } - } - if !r.KeepContext { - defer context.Clear(req) - } - handler.ServeHTTP(w, req) -} - -// Get returns a route registered with the given name. -func (r *Router) Get(name string) *Route { - return r.getNamedRoutes()[name] -} - -// GetRoute returns a route registered with the given name. This method -// was renamed to Get() and remains here for backwards compatibility. -func (r *Router) GetRoute(name string) *Route { - return r.getNamedRoutes()[name] -} - -// StrictSlash defines the trailing slash behavior for new routes. The initial -// value is false. -// -// When true, if the route path is "/path/", accessing "/path" will redirect -// to the former and vice versa. In other words, your application will always -// see the path as specified in the route. -// -// When false, if the route path is "/path", accessing "/path/" will not match -// this route and vice versa. -// -// Special case: when a route sets a path prefix using the PathPrefix() method, -// strict slash is ignored for that route because the redirect behavior can't -// be determined from a prefix alone. However, any subrouters created from that -// route inherit the original StrictSlash setting. -func (r *Router) StrictSlash(value bool) *Router { - r.strictSlash = value - return r -} - -// ---------------------------------------------------------------------------- -// parentRoute -// ---------------------------------------------------------------------------- - -// getNamedRoutes returns the map where named routes are registered. -func (r *Router) getNamedRoutes() map[string]*Route { - if r.namedRoutes == nil { - if r.parent != nil { - r.namedRoutes = r.parent.getNamedRoutes() - } else { - r.namedRoutes = make(map[string]*Route) - } - } - return r.namedRoutes -} - -// getRegexpGroup returns regexp definitions from the parent route, if any. -func (r *Router) getRegexpGroup() *routeRegexpGroup { - if r.parent != nil { - return r.parent.getRegexpGroup() - } - return nil -} - -// ---------------------------------------------------------------------------- -// Route factories -// ---------------------------------------------------------------------------- - -// NewRoute registers an empty route. -func (r *Router) NewRoute() *Route { - route := &Route{parent: r, strictSlash: r.strictSlash} - r.routes = append(r.routes, route) - return route -} - -// Handle registers a new route with a matcher for the URL path. -// See Route.Path() and Route.Handler(). -func (r *Router) Handle(path string, handler http.Handler) *Route { - return r.NewRoute().Path(path).Handler(handler) -} - -// HandleFunc registers a new route with a matcher for the URL path. -// See Route.Path() and Route.HandlerFunc(). -func (r *Router) HandleFunc(path string, f func(http.ResponseWriter, - *http.Request)) *Route { - return r.NewRoute().Path(path).HandlerFunc(f) -} - -// Headers registers a new route with a matcher for request header values. -// See Route.Headers(). -func (r *Router) Headers(pairs ...string) *Route { - return r.NewRoute().Headers(pairs...) -} - -// Host registers a new route with a matcher for the URL host. -// See Route.Host(). -func (r *Router) Host(tpl string) *Route { - return r.NewRoute().Host(tpl) -} - -// MatcherFunc registers a new route with a custom matcher function. -// See Route.MatcherFunc(). -func (r *Router) MatcherFunc(f MatcherFunc) *Route { - return r.NewRoute().MatcherFunc(f) -} - -// Methods registers a new route with a matcher for HTTP methods. -// See Route.Methods(). -func (r *Router) Methods(methods ...string) *Route { - return r.NewRoute().Methods(methods...) -} - -// Path registers a new route with a matcher for the URL path. -// See Route.Path(). -func (r *Router) Path(tpl string) *Route { - return r.NewRoute().Path(tpl) -} - -// PathPrefix registers a new route with a matcher for the URL path prefix. -// See Route.PathPrefix(). -func (r *Router) PathPrefix(tpl string) *Route { - return r.NewRoute().PathPrefix(tpl) -} - -// Queries registers a new route with a matcher for URL query values. -// See Route.Queries(). -func (r *Router) Queries(pairs ...string) *Route { - return r.NewRoute().Queries(pairs...) -} - -// Schemes registers a new route with a matcher for URL schemes. -// See Route.Schemes(). -func (r *Router) Schemes(schemes ...string) *Route { - return r.NewRoute().Schemes(schemes...) -} - -// ---------------------------------------------------------------------------- -// Context -// ---------------------------------------------------------------------------- - -// RouteMatch stores information about a matched route. -type RouteMatch struct { - Route *Route - Handler http.Handler - Vars map[string]string -} - -type contextKey int - -const ( - varsKey contextKey = iota - routeKey -) - -// Vars returns the route variables for the current request, if any. -func Vars(r *http.Request) map[string]string { - if rv := context.Get(r, varsKey); rv != nil { - return rv.(map[string]string) - } - return nil -} - -// CurrentRoute returns the matched route for the current request, if any. -func CurrentRoute(r *http.Request) *Route { - if rv := context.Get(r, routeKey); rv != nil { - return rv.(*Route) - } - return nil -} - -func setVars(r *http.Request, val interface{}) { - context.Set(r, varsKey, val) -} - -func setCurrentRoute(r *http.Request, val interface{}) { - context.Set(r, routeKey, val) -} - -// ---------------------------------------------------------------------------- -// Helpers -// ---------------------------------------------------------------------------- - -// cleanPath returns the canonical path for p, eliminating . and .. elements. -// Borrowed from the net/http package. -func cleanPath(p string) string { - if p == "" { - return "/" - } - if p[0] != '/' { - p = "/" + p - } - np := path.Clean(p) - // path.Clean removes trailing slash except for root; - // put the trailing slash back if necessary. - if p[len(p)-1] == '/' && np != "/" { - np += "/" - } - return np -} - -// uniqueVars returns an error if two slices contain duplicated strings. -func uniqueVars(s1, s2 []string) error { - for _, v1 := range s1 { - for _, v2 := range s2 { - if v1 == v2 { - return fmt.Errorf("mux: duplicated route variable %q", v2) - } - } - } - return nil -} - -// mapFromPairs converts variadic string parameters to a string map. -func mapFromPairs(pairs ...string) (map[string]string, error) { - length := len(pairs) - if length%2 != 0 { - return nil, fmt.Errorf( - "mux: number of parameters must be multiple of 2, got %v", pairs) - } - m := make(map[string]string, length/2) - for i := 0; i < length; i += 2 { - m[pairs[i]] = pairs[i+1] - } - return m, nil -} - -// matchInArray returns true if the given string value is in the array. -func matchInArray(arr []string, value string) bool { - for _, v := range arr { - if v == value { - return true - } - } - return false -} - -// matchMap returns true if the given key/value pairs exist in a given map. -func matchMap(toCheck map[string]string, toMatch map[string][]string, - canonicalKey bool) bool { - for k, v := range toCheck { - // Check if key exists. - if canonicalKey { - k = http.CanonicalHeaderKey(k) - } - if values := toMatch[k]; values == nil { - return false - } else if v != "" { - // If value was defined as an empty string we only check that the - // key exists. Otherwise we also check for equality. - valueExists := false - for _, value := range values { - if v == value { - valueExists = true - break - } - } - if !valueExists { - return false - } - } - } - return true -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux_test.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux_test.go deleted file mode 100644 index e455bce8f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/mux_test.go +++ /dev/null @@ -1,943 +0,0 @@ -// Copyright 2012 The Gorilla 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 mux - -import ( - "fmt" - "net/http" - "testing" - - "github.com/gorilla/context" -) - -type routeTest struct { - title string // title of the test - route *Route // the route being tested - request *http.Request // a request to test the route - vars map[string]string // the expected vars of the match - host string // the expected host of the match - path string // the expected path of the match - shouldMatch bool // whether the request is expected to match the route at all - shouldRedirect bool // whether the request should result in a redirect -} - -func TestHost(t *testing.T) { - // newRequestHost a new request with a method, url, and host header - newRequestHost := func(method, url, host string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - req.Host = host - return req - } - - tests := []routeTest{ - { - title: "Host route match", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route, wrong host in request URL", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - { - title: "Host route with port, match", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequest("GET", "http://aaa.bbb.ccc:1234/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: true, - }, - { - title: "Host route with port, wrong port in request URL", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequest("GET", "http://aaa.bbb.ccc:9999/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: false, - }, - { - title: "Host route, match with host in request header", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route, wrong host in request header", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequestHost("GET", "/111/222/333", "aaa.222.ccc"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - // BUG {new(Route).Host("aaa.bbb.ccc:1234"), newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc:1234"), map[string]string{}, "aaa.bbb.ccc:1234", "", true}, - { - title: "Host route with port, wrong host in request header", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc:9999"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: false, - }, - { - title: "Host route with pattern, match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with pattern, wrong host in request URL", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - { - title: "Host route with multiple patterns, match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with multiple patterns, wrong host in request URL", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - } - for _, test := range tests { - testRoute(t, test) - } -} - -func TestPath(t *testing.T) { - tests := []routeTest{ - { - title: "Path route, match", - route: new(Route).Path("/111/222/333"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route, match with trailing slash in request and path", - route: new(Route).Path("/111/"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - }, - { - title: "Path route, do not match with trailing slash in path", - route: new(Route).Path("/111/"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: false, - }, - { - title: "Path route, do not match with trailing slash in request", - route: new(Route).Path("/111"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: false, - }, - { - title: "Path route, wrong path in request in request URL", - route: new(Route).Path("/111/222/333"), - request: newRequest("GET", "http://localhost/1/2/3"), - vars: map[string]string{}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Path route with pattern, match", - route: new(Route).Path("/111/{v1:[0-9]{3}}/333"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with pattern, URL in request does not match", - route: new(Route).Path("/111/{v1:[0-9]{3}}/333"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Path route with multiple patterns, match", - route: new(Route).Path("/{v1:[0-9]{3}}/{v2:[0-9]{3}}/{v3:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "111", "v2": "222", "v3": "333"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with multiple patterns, URL in request does not match", - route: new(Route).Path("/{v1:[0-9]{3}}/{v2:[0-9]{3}}/{v3:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "111", "v2": "222", "v3": "333"}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestPathPrefix(t *testing.T) { - tests := []routeTest{ - { - title: "PathPrefix route, match", - route: new(Route).PathPrefix("/111"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - }, - { - title: "PathPrefix route, match substring", - route: new(Route).PathPrefix("/1"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/1", - shouldMatch: true, - }, - { - title: "PathPrefix route, URL prefix in request does not match", - route: new(Route).PathPrefix("/111"), - request: newRequest("GET", "http://localhost/1/2/3"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: false, - }, - { - title: "PathPrefix route with pattern, match", - route: new(Route).PathPrefix("/111/{v1:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222", - shouldMatch: true, - }, - { - title: "PathPrefix route with pattern, URL prefix in request does not match", - route: new(Route).PathPrefix("/111/{v1:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222", - shouldMatch: false, - }, - { - title: "PathPrefix route with multiple patterns, match", - route: new(Route).PathPrefix("/{v1:[0-9]{3}}/{v2:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "111", "v2": "222"}, - host: "", - path: "/111/222", - shouldMatch: true, - }, - { - title: "PathPrefix route with multiple patterns, URL prefix in request does not match", - route: new(Route).PathPrefix("/{v1:[0-9]{3}}/{v2:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "111", "v2": "222"}, - host: "", - path: "/111/222", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestHostPath(t *testing.T) { - tests := []routeTest{ - { - title: "Host and Path route, match", - route: new(Route).Host("aaa.bbb.ccc").Path("/111/222/333"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Host and Path route, wrong host in request URL", - route: new(Route).Host("aaa.bbb.ccc").Path("/111/222/333"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Host and Path route with pattern, match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc").Path("/111/{v2:[0-9]{3}}/333"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb", "v2": "222"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Host and Path route with pattern, URL in request does not match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc").Path("/111/{v2:[0-9]{3}}/333"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb", "v2": "222"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Host and Path route with multiple patterns, match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}").Path("/{v4:[0-9]{3}}/{v5:[0-9]{3}}/{v6:[0-9]{3}}"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc", "v4": "111", "v5": "222", "v6": "333"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Host and Path route with multiple patterns, URL in request does not match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}").Path("/{v4:[0-9]{3}}/{v5:[0-9]{3}}/{v6:[0-9]{3}}"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc", "v4": "111", "v5": "222", "v6": "333"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestHeaders(t *testing.T) { - // newRequestHeaders creates a new request with a method, url, and headers - newRequestHeaders := func(method, url string, headers map[string]string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - for k, v := range headers { - req.Header.Add(k, v) - } - return req - } - - tests := []routeTest{ - { - title: "Headers route, match", - route: new(Route).Headers("foo", "bar", "baz", "ding"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "bar", "baz": "ding"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Headers route, bad header values", - route: new(Route).Headers("foo", "bar", "baz", "ding"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "bar", "baz": "dong"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } - -} - -func TestMethods(t *testing.T) { - tests := []routeTest{ - { - title: "Methods route, match GET", - route: new(Route).Methods("GET", "POST"), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Methods route, match POST", - route: new(Route).Methods("GET", "POST"), - request: newRequest("POST", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Methods route, bad method", - route: new(Route).Methods("GET", "POST"), - request: newRequest("PUT", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestQueries(t *testing.T) { - tests := []routeTest{ - { - title: "Queries route, match", - route: new(Route).Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://localhost?foo=bar&baz=ding"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, match with a query string", - route: new(Route).Host("www.example.com").Path("/api").Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://www.example.com/api?foo=bar&baz=ding"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, match with a query string out of order", - route: new(Route).Host("www.example.com").Path("/api").Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://www.example.com/api?baz=ding&foo=bar"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, bad query", - route: new(Route).Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://localhost?foo=bar&baz=dong"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with pattern, match", - route: new(Route).Queries("foo", "{v1}"), - request: newRequest("GET", "http://localhost?foo=bar"), - vars: map[string]string{"v1": "bar"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with multiple patterns, match", - route: new(Route).Queries("foo", "{v1}", "baz", "{v2}"), - request: newRequest("GET", "http://localhost?foo=bar&baz=ding"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern, match", - route: new(Route).Queries("foo", "{v1:[0-9]+}"), - request: newRequest("GET", "http://localhost?foo=10"), - vars: map[string]string{"v1": "10"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern, regexp does not match", - route: new(Route).Queries("foo", "{v1:[0-9]+}"), - request: newRequest("GET", "http://localhost?foo=a"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestSchemes(t *testing.T) { - tests := []routeTest{ - // Schemes - { - title: "Schemes route, match https", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "https://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Schemes route, match ftp", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "ftp://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Schemes route, bad scheme", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - for _, test := range tests { - testRoute(t, test) - } -} - -func TestMatcherFunc(t *testing.T) { - m := func(r *http.Request, m *RouteMatch) bool { - if r.URL.Host == "aaa.bbb.ccc" { - return true - } - return false - } - - tests := []routeTest{ - { - title: "MatchFunc route, match", - route: new(Route).MatcherFunc(m), - request: newRequest("GET", "http://aaa.bbb.ccc"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "MatchFunc route, non-match", - route: new(Route).MatcherFunc(m), - request: newRequest("GET", "http://aaa.222.ccc"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestSubRouter(t *testing.T) { - subrouter1 := new(Route).Host("{v1:[a-z]+}.google.com").Subrouter() - subrouter2 := new(Route).PathPrefix("/foo/{v1}").Subrouter() - - tests := []routeTest{ - { - route: subrouter1.Path("/{v2:[a-z]+}"), - request: newRequest("GET", "http://aaa.google.com/bbb"), - vars: map[string]string{"v1": "aaa", "v2": "bbb"}, - host: "aaa.google.com", - path: "/bbb", - shouldMatch: true, - }, - { - route: subrouter1.Path("/{v2:[a-z]+}"), - request: newRequest("GET", "http://111.google.com/111"), - vars: map[string]string{"v1": "aaa", "v2": "bbb"}, - host: "aaa.google.com", - path: "/bbb", - shouldMatch: false, - }, - { - route: subrouter2.Path("/baz/{v2}"), - request: newRequest("GET", "http://localhost/foo/bar/baz/ding"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "/foo/bar/baz/ding", - shouldMatch: true, - }, - { - route: subrouter2.Path("/baz/{v2}"), - request: newRequest("GET", "http://localhost/foo/bar"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "/foo/bar/baz/ding", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestNamedRoutes(t *testing.T) { - r1 := NewRouter() - r1.NewRoute().Name("a") - r1.NewRoute().Name("b") - r1.NewRoute().Name("c") - - r2 := r1.NewRoute().Subrouter() - r2.NewRoute().Name("d") - r2.NewRoute().Name("e") - r2.NewRoute().Name("f") - - r3 := r2.NewRoute().Subrouter() - r3.NewRoute().Name("g") - r3.NewRoute().Name("h") - r3.NewRoute().Name("i") - - if r1.namedRoutes == nil || len(r1.namedRoutes) != 9 { - t.Errorf("Expected 9 named routes, got %v", r1.namedRoutes) - } else if r1.Get("i") == nil { - t.Errorf("Subroute name not registered") - } -} - -func TestStrictSlash(t *testing.T) { - r := NewRouter() - r.StrictSlash(true) - - tests := []routeTest{ - { - title: "Redirect path without slash", - route: r.NewRoute().Path("/111/"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Do not redirect path with slash", - route: r.NewRoute().Path("/111/"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - shouldRedirect: false, - }, - { - title: "Redirect path with slash", - route: r.NewRoute().Path("/111"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Do not redirect path without slash", - route: r.NewRoute().Path("/111"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - shouldRedirect: false, - }, - { - title: "Propagate StrictSlash to subrouters", - route: r.NewRoute().PathPrefix("/static/").Subrouter().Path("/images/"), - request: newRequest("GET", "http://localhost/static/images"), - vars: map[string]string{}, - host: "", - path: "/static/images/", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Ignore StrictSlash for path prefix", - route: r.NewRoute().PathPrefix("/static/"), - request: newRequest("GET", "http://localhost/static/logo.png"), - vars: map[string]string{}, - host: "", - path: "/static/", - shouldMatch: true, - shouldRedirect: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -// ---------------------------------------------------------------------------- -// Helpers -// ---------------------------------------------------------------------------- - -func getRouteTemplate(route *Route) string { - host, path := "none", "none" - if route.regexp != nil { - if route.regexp.host != nil { - host = route.regexp.host.template - } - if route.regexp.path != nil { - path = route.regexp.path.template - } - } - return fmt.Sprintf("Host: %v, Path: %v", host, path) -} - -func testRoute(t *testing.T, test routeTest) { - request := test.request - route := test.route - vars := test.vars - shouldMatch := test.shouldMatch - host := test.host - path := test.path - url := test.host + test.path - shouldRedirect := test.shouldRedirect - - var match RouteMatch - ok := route.Match(request, &match) - if ok != shouldMatch { - msg := "Should match" - if !shouldMatch { - msg = "Should not match" - } - t.Errorf("(%v) %v:\nRoute: %#v\nRequest: %#v\nVars: %v\n", test.title, msg, route, request, vars) - return - } - if shouldMatch { - if test.vars != nil && !stringMapEqual(test.vars, match.Vars) { - t.Errorf("(%v) Vars not equal: expected %v, got %v", test.title, vars, match.Vars) - return - } - if host != "" { - u, _ := test.route.URLHost(mapToPairs(match.Vars)...) - if host != u.Host { - t.Errorf("(%v) URLHost not equal: expected %v, got %v -- %v", test.title, host, u.Host, getRouteTemplate(route)) - return - } - } - if path != "" { - u, _ := route.URLPath(mapToPairs(match.Vars)...) - if path != u.Path { - t.Errorf("(%v) URLPath not equal: expected %v, got %v -- %v", test.title, path, u.Path, getRouteTemplate(route)) - return - } - } - if url != "" { - u, _ := route.URL(mapToPairs(match.Vars)...) - if url != u.Host+u.Path { - t.Errorf("(%v) URL not equal: expected %v, got %v -- %v", test.title, url, u.Host+u.Path, getRouteTemplate(route)) - return - } - } - if shouldRedirect && match.Handler == nil { - t.Errorf("(%v) Did not redirect", test.title) - return - } - if !shouldRedirect && match.Handler != nil { - t.Errorf("(%v) Unexpected redirect", test.title) - return - } - } -} - -// Tests that the context is cleared or not cleared properly depending on -// the configuration of the router -func TestKeepContext(t *testing.T) { - func1 := func(w http.ResponseWriter, r *http.Request) {} - - r := NewRouter() - r.HandleFunc("/", func1).Name("func1") - - req, _ := http.NewRequest("GET", "http://localhost/", nil) - context.Set(req, "t", 1) - - res := new(http.ResponseWriter) - r.ServeHTTP(*res, req) - - if _, ok := context.GetOk(req, "t"); ok { - t.Error("Context should have been cleared at end of request") - } - - r.KeepContext = true - - req, _ = http.NewRequest("GET", "http://localhost/", nil) - context.Set(req, "t", 1) - - r.ServeHTTP(*res, req) - if _, ok := context.GetOk(req, "t"); !ok { - t.Error("Context should NOT have been cleared at end of request") - } - -} - -type TestA301ResponseWriter struct { - hh http.Header - status int -} - -func (ho TestA301ResponseWriter) Header() http.Header { - return http.Header(ho.hh) -} - -func (ho TestA301ResponseWriter) Write(b []byte) (int, error) { - return 0, nil -} - -func (ho TestA301ResponseWriter) WriteHeader(code int) { - ho.status = code -} - -func Test301Redirect(t *testing.T) { - m := make(http.Header) - - func1 := func(w http.ResponseWriter, r *http.Request) {} - func2 := func(w http.ResponseWriter, r *http.Request) {} - - r := NewRouter() - r.HandleFunc("/api/", func2).Name("func2") - r.HandleFunc("/", func1).Name("func1") - - req, _ := http.NewRequest("GET", "http://localhost//api/?abc=def", nil) - - res := TestA301ResponseWriter{ - hh: m, - status: 0, - } - r.ServeHTTP(&res, req) - - if "http://localhost/api/?abc=def" != res.hh["Location"][0] { - t.Errorf("Should have complete URL with query string") - } -} - -// https://plus.google.com/101022900381697718949/posts/eWy6DjFJ6uW -func TestSubrouterHeader(t *testing.T) { - expected := "func1 response" - func1 := func(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, expected) - } - func2 := func(http.ResponseWriter, *http.Request) {} - - r := NewRouter() - s := r.Headers("SomeSpecialHeader", "").Subrouter() - s.HandleFunc("/", func1).Name("func1") - r.HandleFunc("/", func2).Name("func2") - - req, _ := http.NewRequest("GET", "http://localhost/", nil) - req.Header.Add("SomeSpecialHeader", "foo") - match := new(RouteMatch) - matched := r.Match(req, match) - if !matched { - t.Errorf("Should match request") - } - if match.Route.GetName() != "func1" { - t.Errorf("Expecting func1 handler, got %s", match.Route.GetName()) - } - resp := NewRecorder() - match.Handler.ServeHTTP(resp, req) - if resp.Body.String() != expected { - t.Errorf("Expecting %q", expected) - } -} - -// mapToPairs converts a string map to a slice of string pairs -func mapToPairs(m map[string]string) []string { - var i int - p := make([]string, len(m)*2) - for k, v := range m { - p[i] = k - p[i+1] = v - i += 2 - } - return p -} - -// stringMapEqual checks the equality of two string maps -func stringMapEqual(m1, m2 map[string]string) bool { - nil1 := m1 == nil - nil2 := m2 == nil - if nil1 != nil2 || len(m1) != len(m2) { - return false - } - for k, v := range m1 { - if v != m2[k] { - return false - } - } - return true -} - -// newRequest is a helper function to create a new request with a method and url -func newRequest(method, url string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - return req -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/old_test.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/old_test.go deleted file mode 100644 index 1f7c190c0..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/old_test.go +++ /dev/null @@ -1,714 +0,0 @@ -// Old tests ported to Go1. This is a mess. Want to drop it one day. - -// Copyright 2011 Gorilla 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 mux - -import ( - "bytes" - "net/http" - "testing" -) - -// ---------------------------------------------------------------------------- -// ResponseRecorder -// ---------------------------------------------------------------------------- -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// ResponseRecorder is an implementation of http.ResponseWriter that -// records its mutations for later inspection in tests. -type ResponseRecorder struct { - Code int // the HTTP response code from WriteHeader - HeaderMap http.Header // the HTTP response headers - Body *bytes.Buffer // if non-nil, the bytes.Buffer to append written data to - Flushed bool -} - -// NewRecorder returns an initialized ResponseRecorder. -func NewRecorder() *ResponseRecorder { - return &ResponseRecorder{ - HeaderMap: make(http.Header), - Body: new(bytes.Buffer), - } -} - -// DefaultRemoteAddr is the default remote address to return in RemoteAddr if -// an explicit DefaultRemoteAddr isn't set on ResponseRecorder. -const DefaultRemoteAddr = "1.2.3.4" - -// Header returns the response headers. -func (rw *ResponseRecorder) Header() http.Header { - return rw.HeaderMap -} - -// Write always succeeds and writes to rw.Body, if not nil. -func (rw *ResponseRecorder) Write(buf []byte) (int, error) { - if rw.Body != nil { - rw.Body.Write(buf) - } - if rw.Code == 0 { - rw.Code = http.StatusOK - } - return len(buf), nil -} - -// WriteHeader sets rw.Code. -func (rw *ResponseRecorder) WriteHeader(code int) { - rw.Code = code -} - -// Flush sets rw.Flushed to true. -func (rw *ResponseRecorder) Flush() { - rw.Flushed = true -} - -// ---------------------------------------------------------------------------- - -func TestRouteMatchers(t *testing.T) { - var scheme, host, path, query, method string - var headers map[string]string - var resultVars map[bool]map[string]string - - router := NewRouter() - router.NewRoute().Host("{var1}.google.com"). - Path("/{var2:[a-z]+}/{var3:[0-9]+}"). - Queries("foo", "bar"). - Methods("GET"). - Schemes("https"). - Headers("x-requested-with", "XMLHttpRequest") - router.NewRoute().Host("www.{var4}.com"). - PathPrefix("/foo/{var5:[a-z]+}/{var6:[0-9]+}"). - Queries("baz", "ding"). - Methods("POST"). - Schemes("http"). - Headers("Content-Type", "application/json") - - reset := func() { - // Everything match. - scheme = "https" - host = "www.google.com" - path = "/product/42" - query = "?foo=bar" - method = "GET" - headers = map[string]string{"X-Requested-With": "XMLHttpRequest"} - resultVars = map[bool]map[string]string{ - true: {"var1": "www", "var2": "product", "var3": "42"}, - false: {}, - } - } - - reset2 := func() { - // Everything match. - scheme = "http" - host = "www.google.com" - path = "/foo/product/42/path/that/is/ignored" - query = "?baz=ding" - method = "POST" - headers = map[string]string{"Content-Type": "application/json"} - resultVars = map[bool]map[string]string{ - true: {"var4": "google", "var5": "product", "var6": "42"}, - false: {}, - } - } - - match := func(shouldMatch bool) { - url := scheme + "://" + host + path + query - request, _ := http.NewRequest(method, url, nil) - for key, value := range headers { - request.Header.Add(key, value) - } - - var routeMatch RouteMatch - matched := router.Match(request, &routeMatch) - if matched != shouldMatch { - // Need better messages. :) - if matched { - t.Errorf("Should match.") - } else { - t.Errorf("Should not match.") - } - } - - if matched { - currentRoute := routeMatch.Route - if currentRoute == nil { - t.Errorf("Expected a current route.") - } - vars := routeMatch.Vars - expectedVars := resultVars[shouldMatch] - if len(vars) != len(expectedVars) { - t.Errorf("Expected vars: %v Got: %v.", expectedVars, vars) - } - for name, value := range vars { - if expectedVars[name] != value { - t.Errorf("Expected vars: %v Got: %v.", expectedVars, vars) - } - } - } - } - - // 1st route -------------------------------------------------------------- - - // Everything match. - reset() - match(true) - - // Scheme doesn't match. - reset() - scheme = "http" - match(false) - - // Host doesn't match. - reset() - host = "www.mygoogle.com" - match(false) - - // Path doesn't match. - reset() - path = "/product/notdigits" - match(false) - - // Query doesn't match. - reset() - query = "?foo=baz" - match(false) - - // Method doesn't match. - reset() - method = "POST" - match(false) - - // Header doesn't match. - reset() - headers = map[string]string{} - match(false) - - // Everything match, again. - reset() - match(true) - - // 2nd route -------------------------------------------------------------- - - // Everything match. - reset2() - match(true) - - // Scheme doesn't match. - reset2() - scheme = "https" - match(false) - - // Host doesn't match. - reset2() - host = "sub.google.com" - match(false) - - // Path doesn't match. - reset2() - path = "/bar/product/42" - match(false) - - // Query doesn't match. - reset2() - query = "?foo=baz" - match(false) - - // Method doesn't match. - reset2() - method = "GET" - match(false) - - // Header doesn't match. - reset2() - headers = map[string]string{} - match(false) - - // Everything match, again. - reset2() - match(true) -} - -type headerMatcherTest struct { - matcher headerMatcher - headers map[string]string - result bool -} - -var headerMatcherTests = []headerMatcherTest{ - { - matcher: headerMatcher(map[string]string{"x-requested-with": "XMLHttpRequest"}), - headers: map[string]string{"X-Requested-With": "XMLHttpRequest"}, - result: true, - }, - { - matcher: headerMatcher(map[string]string{"x-requested-with": ""}), - headers: map[string]string{"X-Requested-With": "anything"}, - result: true, - }, - { - matcher: headerMatcher(map[string]string{"x-requested-with": "XMLHttpRequest"}), - headers: map[string]string{}, - result: false, - }, -} - -type hostMatcherTest struct { - matcher *Route - url string - vars map[string]string - result bool -} - -var hostMatcherTests = []hostMatcherTest{ - { - matcher: NewRouter().NewRoute().Host("{foo:[a-z][a-z][a-z]}.{bar:[a-z][a-z][a-z]}.{baz:[a-z][a-z][a-z]}"), - url: "http://abc.def.ghi/", - vars: map[string]string{"foo": "abc", "bar": "def", "baz": "ghi"}, - result: true, - }, - { - matcher: NewRouter().NewRoute().Host("{foo:[a-z][a-z][a-z]}.{bar:[a-z][a-z][a-z]}.{baz:[a-z][a-z][a-z]}"), - url: "http://a.b.c/", - vars: map[string]string{"foo": "abc", "bar": "def", "baz": "ghi"}, - result: false, - }, -} - -type methodMatcherTest struct { - matcher methodMatcher - method string - result bool -} - -var methodMatcherTests = []methodMatcherTest{ - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "GET", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "POST", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "PUT", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "DELETE", - result: false, - }, -} - -type pathMatcherTest struct { - matcher *Route - url string - vars map[string]string - result bool -} - -var pathMatcherTests = []pathMatcherTest{ - { - matcher: NewRouter().NewRoute().Path("/{foo:[0-9][0-9][0-9]}/{bar:[0-9][0-9][0-9]}/{baz:[0-9][0-9][0-9]}"), - url: "http://localhost:8080/123/456/789", - vars: map[string]string{"foo": "123", "bar": "456", "baz": "789"}, - result: true, - }, - { - matcher: NewRouter().NewRoute().Path("/{foo:[0-9][0-9][0-9]}/{bar:[0-9][0-9][0-9]}/{baz:[0-9][0-9][0-9]}"), - url: "http://localhost:8080/1/2/3", - vars: map[string]string{"foo": "123", "bar": "456", "baz": "789"}, - result: false, - }, -} - -type schemeMatcherTest struct { - matcher schemeMatcher - url string - result bool -} - -var schemeMatcherTests = []schemeMatcherTest{ - { - matcher: schemeMatcher([]string{"http", "https"}), - url: "http://localhost:8080/", - result: true, - }, - { - matcher: schemeMatcher([]string{"http", "https"}), - url: "https://localhost:8080/", - result: true, - }, - { - matcher: schemeMatcher([]string{"https"}), - url: "http://localhost:8080/", - result: false, - }, - { - matcher: schemeMatcher([]string{"http"}), - url: "https://localhost:8080/", - result: false, - }, -} - -type urlBuildingTest struct { - route *Route - vars []string - url string -} - -var urlBuildingTests = []urlBuildingTest{ - { - route: new(Route).Host("foo.domain.com"), - vars: []string{}, - url: "http://foo.domain.com", - }, - { - route: new(Route).Host("{subdomain}.domain.com"), - vars: []string{"subdomain", "bar"}, - url: "http://bar.domain.com", - }, - { - route: new(Route).Host("foo.domain.com").Path("/articles"), - vars: []string{}, - url: "http://foo.domain.com/articles", - }, - { - route: new(Route).Path("/articles"), - vars: []string{}, - url: "/articles", - }, - { - route: new(Route).Path("/articles/{category}/{id:[0-9]+}"), - vars: []string{"category", "technology", "id", "42"}, - url: "/articles/technology/42", - }, - { - route: new(Route).Host("{subdomain}.domain.com").Path("/articles/{category}/{id:[0-9]+}"), - vars: []string{"subdomain", "foo", "category", "technology", "id", "42"}, - url: "http://foo.domain.com/articles/technology/42", - }, -} - -func TestHeaderMatcher(t *testing.T) { - for _, v := range headerMatcherTests { - request, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - for key, value := range v.headers { - request.Header.Add(key, value) - } - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, request.Header) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, request.Header) - } - } - } -} - -func TestHostMatcher(t *testing.T) { - for _, v := range hostMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - vars := routeMatch.Vars - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - if result { - if len(vars) != len(v.vars) { - t.Errorf("%#v: vars length should be %v, got %v.", v.matcher, len(v.vars), len(vars)) - } - for name, value := range vars { - if v.vars[name] != value { - t.Errorf("%#v: expected value %v for key %v, got %v.", v.matcher, v.vars[name], name, value) - } - } - } else { - if len(vars) != 0 { - t.Errorf("%#v: vars length should be 0, got %v.", v.matcher, len(vars)) - } - } - } -} - -func TestMethodMatcher(t *testing.T) { - for _, v := range methodMatcherTests { - request, _ := http.NewRequest(v.method, "http://localhost:8080/", nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.method) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.method) - } - } - } -} - -func TestPathMatcher(t *testing.T) { - for _, v := range pathMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - vars := routeMatch.Vars - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - if result { - if len(vars) != len(v.vars) { - t.Errorf("%#v: vars length should be %v, got %v.", v.matcher, len(v.vars), len(vars)) - } - for name, value := range vars { - if v.vars[name] != value { - t.Errorf("%#v: expected value %v for key %v, got %v.", v.matcher, v.vars[name], name, value) - } - } - } else { - if len(vars) != 0 { - t.Errorf("%#v: vars length should be 0, got %v.", v.matcher, len(vars)) - } - } - } -} - -func TestSchemeMatcher(t *testing.T) { - for _, v := range schemeMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - } -} - -func TestUrlBuilding(t *testing.T) { - - for _, v := range urlBuildingTests { - u, _ := v.route.URL(v.vars...) - url := u.String() - if url != v.url { - t.Errorf("expected %v, got %v", v.url, url) - /* - reversePath := "" - reverseHost := "" - if v.route.pathTemplate != nil { - reversePath = v.route.pathTemplate.Reverse - } - if v.route.hostTemplate != nil { - reverseHost = v.route.hostTemplate.Reverse - } - - t.Errorf("%#v:\nexpected: %q\ngot: %q\nreverse path: %q\nreverse host: %q", v.route, v.url, url, reversePath, reverseHost) - */ - } - } - - ArticleHandler := func(w http.ResponseWriter, r *http.Request) { - } - - router := NewRouter() - router.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).Name("article") - - url, _ := router.Get("article").URL("category", "technology", "id", "42") - expected := "/articles/technology/42" - if url.String() != expected { - t.Errorf("Expected %v, got %v", expected, url.String()) - } -} - -func TestMatchedRouteName(t *testing.T) { - routeName := "stock" - router := NewRouter() - route := router.NewRoute().Path("/products/").Name(routeName) - - url := "http://www.domain.com/products/" - request, _ := http.NewRequest("GET", url, nil) - var rv RouteMatch - ok := router.Match(request, &rv) - - if !ok || rv.Route != route { - t.Errorf("Expected same route, got %+v.", rv.Route) - } - - retName := rv.Route.GetName() - if retName != routeName { - t.Errorf("Expected %q, got %q.", routeName, retName) - } -} - -func TestSubRouting(t *testing.T) { - // Example from docs. - router := NewRouter() - subrouter := router.NewRoute().Host("www.domain.com").Subrouter() - route := subrouter.NewRoute().Path("/products/").Name("products") - - url := "http://www.domain.com/products/" - request, _ := http.NewRequest("GET", url, nil) - var rv RouteMatch - ok := router.Match(request, &rv) - - if !ok || rv.Route != route { - t.Errorf("Expected same route, got %+v.", rv.Route) - } - - u, _ := router.Get("products").URL() - builtUrl := u.String() - // Yay, subroute aware of the domain when building! - if builtUrl != url { - t.Errorf("Expected %q, got %q.", url, builtUrl) - } -} - -func TestVariableNames(t *testing.T) { - route := new(Route).Host("{arg1}.domain.com").Path("/{arg1}/{arg2:[0-9]+}") - if route.err == nil { - t.Errorf("Expected error for duplicated variable names") - } -} - -func TestRedirectSlash(t *testing.T) { - var route *Route - var routeMatch RouteMatch - r := NewRouter() - - r.StrictSlash(false) - route = r.NewRoute() - if route.strictSlash != false { - t.Errorf("Expected false redirectSlash.") - } - - r.StrictSlash(true) - route = r.NewRoute() - if route.strictSlash != true { - t.Errorf("Expected true redirectSlash.") - } - - route = new(Route) - route.strictSlash = true - route.Path("/{arg1}/{arg2:[0-9]+}/") - request, _ := http.NewRequest("GET", "http://localhost/foo/123", nil) - routeMatch = RouteMatch{} - _ = route.Match(request, &routeMatch) - vars := routeMatch.Vars - if vars["arg1"] != "foo" { - t.Errorf("Expected foo.") - } - if vars["arg2"] != "123" { - t.Errorf("Expected 123.") - } - rsp := NewRecorder() - routeMatch.Handler.ServeHTTP(rsp, request) - if rsp.HeaderMap.Get("Location") != "http://localhost/foo/123/" { - t.Errorf("Expected redirect header.") - } - - route = new(Route) - route.strictSlash = true - route.Path("/{arg1}/{arg2:[0-9]+}") - request, _ = http.NewRequest("GET", "http://localhost/foo/123/", nil) - routeMatch = RouteMatch{} - _ = route.Match(request, &routeMatch) - vars = routeMatch.Vars - if vars["arg1"] != "foo" { - t.Errorf("Expected foo.") - } - if vars["arg2"] != "123" { - t.Errorf("Expected 123.") - } - rsp = NewRecorder() - routeMatch.Handler.ServeHTTP(rsp, request) - if rsp.HeaderMap.Get("Location") != "http://localhost/foo/123" { - t.Errorf("Expected redirect header.") - } -} - -// Test for the new regexp library, still not available in stable Go. -func TestNewRegexp(t *testing.T) { - var p *routeRegexp - var matches []string - - tests := map[string]map[string][]string{ - "/{foo:a{2}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": nil, - "/aaaa": nil, - }, - "/{foo:a{2,}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": {"aaa"}, - "/aaaa": {"aaaa"}, - }, - "/{foo:a{2,3}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": {"aaa"}, - "/aaaa": nil, - }, - "/{foo:[a-z]{3}}/{bar:[a-z]{2}}": { - "/a": nil, - "/ab": nil, - "/abc": nil, - "/abcd": nil, - "/abc/ab": {"abc", "ab"}, - "/abc/abc": nil, - "/abcd/ab": nil, - }, - `/{foo:\w{3,}}/{bar:\d{2,}}`: { - "/a": nil, - "/ab": nil, - "/abc": nil, - "/abc/1": nil, - "/abc/12": {"abc", "12"}, - "/abcd/12": {"abcd", "12"}, - "/abcd/123": {"abcd", "123"}, - }, - } - - for pattern, paths := range tests { - p, _ = newRouteRegexp(pattern, false, false, false, false) - for path, result := range paths { - matches = p.regexp.FindStringSubmatch(path) - if result == nil { - if matches != nil { - t.Errorf("%v should not match %v.", pattern, path) - } - } else { - if len(matches) != len(result)+1 { - t.Errorf("Expected %v matches, got %v.", len(result)+1, len(matches)) - } else { - for k, v := range result { - if matches[k+1] != v { - t.Errorf("Expected %v, got %v.", v, matches[k+1]) - } - } - } - } - } - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/regexp.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/regexp.go deleted file mode 100644 index a6305483d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/regexp.go +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2012 The Gorilla 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 mux - -import ( - "bytes" - "fmt" - "net/http" - "net/url" - "regexp" - "strings" -) - -// newRouteRegexp parses a route template and returns a routeRegexp, -// used to match a host, a path or a query string. -// -// It will extract named variables, assemble a regexp to be matched, create -// a "reverse" template to build URLs and compile regexps to validate variable -// values used in URL building. -// -// Previously we accepted only Python-like identifiers for variable -// names ([a-zA-Z_][a-zA-Z0-9_]*), but currently the only restriction is that -// name and pattern can't be empty, and names can't contain a colon. -func newRouteRegexp(tpl string, matchHost, matchPrefix, matchQuery, strictSlash bool) (*routeRegexp, error) { - // Check if it is well-formed. - idxs, errBraces := braceIndices(tpl) - if errBraces != nil { - return nil, errBraces - } - // Backup the original. - template := tpl - // Now let's parse it. - defaultPattern := "[^/]+" - if matchQuery { - defaultPattern = "[^?&]+" - matchPrefix = true - } else if matchHost { - defaultPattern = "[^.]+" - matchPrefix = false - } - // Only match strict slash if not matching - if matchPrefix || matchHost || matchQuery { - strictSlash = false - } - // Set a flag for strictSlash. - endSlash := false - if strictSlash && strings.HasSuffix(tpl, "/") { - tpl = tpl[:len(tpl)-1] - endSlash = true - } - varsN := make([]string, len(idxs)/2) - varsR := make([]*regexp.Regexp, len(idxs)/2) - pattern := bytes.NewBufferString("") - if !matchQuery { - pattern.WriteByte('^') - } - reverse := bytes.NewBufferString("") - var end int - var err error - for i := 0; i < len(idxs); i += 2 { - // Set all values we are interested in. - raw := tpl[end:idxs[i]] - end = idxs[i+1] - parts := strings.SplitN(tpl[idxs[i]+1:end-1], ":", 2) - name := parts[0] - patt := defaultPattern - if len(parts) == 2 { - patt = parts[1] - } - // Name or pattern can't be empty. - if name == "" || patt == "" { - return nil, fmt.Errorf("mux: missing name or pattern in %q", - tpl[idxs[i]:end]) - } - // Build the regexp pattern. - fmt.Fprintf(pattern, "%s(%s)", regexp.QuoteMeta(raw), patt) - // Build the reverse template. - fmt.Fprintf(reverse, "%s%%s", raw) - // Append variable name and compiled pattern. - varsN[i/2] = name - varsR[i/2], err = regexp.Compile(fmt.Sprintf("^%s$", patt)) - if err != nil { - return nil, err - } - } - // Add the remaining. - raw := tpl[end:] - pattern.WriteString(regexp.QuoteMeta(raw)) - if strictSlash { - pattern.WriteString("[/]?") - } - if !matchPrefix { - pattern.WriteByte('$') - } - reverse.WriteString(raw) - if endSlash { - reverse.WriteByte('/') - } - // Compile full regexp. - reg, errCompile := regexp.Compile(pattern.String()) - if errCompile != nil { - return nil, errCompile - } - // Done! - return &routeRegexp{ - template: template, - matchHost: matchHost, - matchQuery: matchQuery, - strictSlash: strictSlash, - regexp: reg, - reverse: reverse.String(), - varsN: varsN, - varsR: varsR, - }, nil -} - -// routeRegexp stores a regexp to match a host or path and information to -// collect and validate route variables. -type routeRegexp struct { - // The unmodified template. - template string - // True for host match, false for path or query string match. - matchHost bool - // True for query string match, false for path and host match. - matchQuery bool - // The strictSlash value defined on the route, but disabled if PathPrefix was used. - strictSlash bool - // Expanded regexp. - regexp *regexp.Regexp - // Reverse template. - reverse string - // Variable names. - varsN []string - // Variable regexps (validators). - varsR []*regexp.Regexp -} - -// Match matches the regexp against the URL host or path. -func (r *routeRegexp) Match(req *http.Request, match *RouteMatch) bool { - if !r.matchHost { - if r.matchQuery { - return r.regexp.MatchString(req.URL.RawQuery) - } else { - return r.regexp.MatchString(req.URL.Path) - } - } - return r.regexp.MatchString(getHost(req)) -} - -// url builds a URL part using the given values. -func (r *routeRegexp) url(pairs ...string) (string, error) { - values, err := mapFromPairs(pairs...) - if err != nil { - return "", err - } - urlValues := make([]interface{}, len(r.varsN)) - for k, v := range r.varsN { - value, ok := values[v] - if !ok { - return "", fmt.Errorf("mux: missing route variable %q", v) - } - urlValues[k] = value - } - rv := fmt.Sprintf(r.reverse, urlValues...) - if !r.regexp.MatchString(rv) { - // The URL is checked against the full regexp, instead of checking - // individual variables. This is faster but to provide a good error - // message, we check individual regexps if the URL doesn't match. - for k, v := range r.varsN { - if !r.varsR[k].MatchString(values[v]) { - return "", fmt.Errorf( - "mux: variable %q doesn't match, expected %q", values[v], - r.varsR[k].String()) - } - } - } - return rv, nil -} - -// braceIndices returns the first level curly brace indices from a string. -// It returns an error in case of unbalanced braces. -func braceIndices(s string) ([]int, error) { - var level, idx int - idxs := make([]int, 0) - for i := 0; i < len(s); i++ { - switch s[i] { - case '{': - if level++; level == 1 { - idx = i - } - case '}': - if level--; level == 0 { - idxs = append(idxs, idx, i+1) - } else if level < 0 { - return nil, fmt.Errorf("mux: unbalanced braces in %q", s) - } - } - } - if level != 0 { - return nil, fmt.Errorf("mux: unbalanced braces in %q", s) - } - return idxs, nil -} - -// ---------------------------------------------------------------------------- -// routeRegexpGroup -// ---------------------------------------------------------------------------- - -// routeRegexpGroup groups the route matchers that carry variables. -type routeRegexpGroup struct { - host *routeRegexp - path *routeRegexp - queries []*routeRegexp -} - -// setMatch extracts the variables from the URL once a route matches. -func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) { - // Store host variables. - if v.host != nil { - hostVars := v.host.regexp.FindStringSubmatch(getHost(req)) - if hostVars != nil { - for k, v := range v.host.varsN { - m.Vars[v] = hostVars[k+1] - } - } - } - // Store path variables. - if v.path != nil { - pathVars := v.path.regexp.FindStringSubmatch(req.URL.Path) - if pathVars != nil { - for k, v := range v.path.varsN { - m.Vars[v] = pathVars[k+1] - } - // Check if we should redirect. - if v.path.strictSlash { - p1 := strings.HasSuffix(req.URL.Path, "/") - p2 := strings.HasSuffix(v.path.template, "/") - if p1 != p2 { - u, _ := url.Parse(req.URL.String()) - if p1 { - u.Path = u.Path[:len(u.Path)-1] - } else { - u.Path += "/" - } - m.Handler = http.RedirectHandler(u.String(), 301) - } - } - } - } - // Store query string variables. - rawQuery := req.URL.RawQuery - for _, q := range v.queries { - queryVars := q.regexp.FindStringSubmatch(rawQuery) - if queryVars != nil { - for k, v := range q.varsN { - m.Vars[v] = queryVars[k+1] - } - } - } -} - -// getHost tries its best to return the request host. -func getHost(r *http.Request) string { - if r.URL.IsAbs() { - return r.URL.Host - } - host := r.Host - // Slice off any port information. - if i := strings.Index(host, ":"); i != -1 { - host = host[:i] - } - return host - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/route.go b/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/route.go deleted file mode 100644 index c310e66bc..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/gorilla/mux/route.go +++ /dev/null @@ -1,524 +0,0 @@ -// Copyright 2012 The Gorilla 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 mux - -import ( - "errors" - "fmt" - "net/http" - "net/url" - "strings" -) - -// Route stores information to match a request and build URLs. -type Route struct { - // Parent where the route was registered (a Router). - parent parentRoute - // Request handler for the route. - handler http.Handler - // List of matchers. - matchers []matcher - // Manager for the variables from host and path. - regexp *routeRegexpGroup - // If true, when the path pattern is "/path/", accessing "/path" will - // redirect to the former and vice versa. - strictSlash bool - // If true, this route never matches: it is only used to build URLs. - buildOnly bool - // The name used to build URLs. - name string - // Error resulted from building a route. - err error -} - -// Match matches the route against the request. -func (r *Route) Match(req *http.Request, match *RouteMatch) bool { - if r.buildOnly || r.err != nil { - return false - } - // Match everything. - for _, m := range r.matchers { - if matched := m.Match(req, match); !matched { - return false - } - } - // Yay, we have a match. Let's collect some info about it. - if match.Route == nil { - match.Route = r - } - if match.Handler == nil { - match.Handler = r.handler - } - if match.Vars == nil { - match.Vars = make(map[string]string) - } - // Set variables. - if r.regexp != nil { - r.regexp.setMatch(req, match, r) - } - return true -} - -// ---------------------------------------------------------------------------- -// Route attributes -// ---------------------------------------------------------------------------- - -// GetError returns an error resulted from building the route, if any. -func (r *Route) GetError() error { - return r.err -} - -// BuildOnly sets the route to never match: it is only used to build URLs. -func (r *Route) BuildOnly() *Route { - r.buildOnly = true - return r -} - -// Handler -------------------------------------------------------------------- - -// Handler sets a handler for the route. -func (r *Route) Handler(handler http.Handler) *Route { - if r.err == nil { - r.handler = handler - } - return r -} - -// HandlerFunc sets a handler function for the route. -func (r *Route) HandlerFunc(f func(http.ResponseWriter, *http.Request)) *Route { - return r.Handler(http.HandlerFunc(f)) -} - -// GetHandler returns the handler for the route, if any. -func (r *Route) GetHandler() http.Handler { - return r.handler -} - -// Name ----------------------------------------------------------------------- - -// Name sets the name for the route, used to build URLs. -// If the name was registered already it will be overwritten. -func (r *Route) Name(name string) *Route { - if r.name != "" { - r.err = fmt.Errorf("mux: route already has name %q, can't set %q", - r.name, name) - } - if r.err == nil { - r.name = name - r.getNamedRoutes()[name] = r - } - return r -} - -// GetName returns the name for the route, if any. -func (r *Route) GetName() string { - return r.name -} - -// ---------------------------------------------------------------------------- -// Matchers -// ---------------------------------------------------------------------------- - -// matcher types try to match a request. -type matcher interface { - Match(*http.Request, *RouteMatch) bool -} - -// addMatcher adds a matcher to the route. -func (r *Route) addMatcher(m matcher) *Route { - if r.err == nil { - r.matchers = append(r.matchers, m) - } - return r -} - -// addRegexpMatcher adds a host or path matcher and builder to a route. -func (r *Route) addRegexpMatcher(tpl string, matchHost, matchPrefix, matchQuery bool) error { - if r.err != nil { - return r.err - } - r.regexp = r.getRegexpGroup() - if !matchHost && !matchQuery { - if len(tpl) == 0 || tpl[0] != '/' { - return fmt.Errorf("mux: path must start with a slash, got %q", tpl) - } - if r.regexp.path != nil { - tpl = strings.TrimRight(r.regexp.path.template, "/") + tpl - } - } - rr, err := newRouteRegexp(tpl, matchHost, matchPrefix, matchQuery, r.strictSlash) - if err != nil { - return err - } - for _, q := range r.regexp.queries { - if err = uniqueVars(rr.varsN, q.varsN); err != nil { - return err - } - } - if matchHost { - if r.regexp.path != nil { - if err = uniqueVars(rr.varsN, r.regexp.path.varsN); err != nil { - return err - } - } - r.regexp.host = rr - } else { - if r.regexp.host != nil { - if err = uniqueVars(rr.varsN, r.regexp.host.varsN); err != nil { - return err - } - } - if matchQuery { - r.regexp.queries = append(r.regexp.queries, rr) - } else { - r.regexp.path = rr - } - } - r.addMatcher(rr) - return nil -} - -// Headers -------------------------------------------------------------------- - -// headerMatcher matches the request against header values. -type headerMatcher map[string]string - -func (m headerMatcher) Match(r *http.Request, match *RouteMatch) bool { - return matchMap(m, r.Header, true) -} - -// Headers adds a matcher for request header values. -// It accepts a sequence of key/value pairs to be matched. For example: -// -// r := mux.NewRouter() -// r.Headers("Content-Type", "application/json", -// "X-Requested-With", "XMLHttpRequest") -// -// The above route will only match if both request header values match. -// -// It the value is an empty string, it will match any value if the key is set. -func (r *Route) Headers(pairs ...string) *Route { - if r.err == nil { - var headers map[string]string - headers, r.err = mapFromPairs(pairs...) - return r.addMatcher(headerMatcher(headers)) - } - return r -} - -// Host ----------------------------------------------------------------------- - -// Host adds a matcher for the URL host. -// It accepts a template with zero or more URL variables enclosed by {}. -// Variables can define an optional regexp pattern to me matched: -// -// - {name} matches anything until the next dot. -// -// - {name:pattern} matches the given regexp pattern. -// -// For example: -// -// r := mux.NewRouter() -// r.Host("www.domain.com") -// r.Host("{subdomain}.domain.com") -// r.Host("{subdomain:[a-z]+}.domain.com") -// -// Variable names must be unique in a given route. They can be retrieved -// calling mux.Vars(request). -func (r *Route) Host(tpl string) *Route { - r.err = r.addRegexpMatcher(tpl, true, false, false) - return r -} - -// MatcherFunc ---------------------------------------------------------------- - -// MatcherFunc is the function signature used by custom matchers. -type MatcherFunc func(*http.Request, *RouteMatch) bool - -func (m MatcherFunc) Match(r *http.Request, match *RouteMatch) bool { - return m(r, match) -} - -// MatcherFunc adds a custom function to be used as request matcher. -func (r *Route) MatcherFunc(f MatcherFunc) *Route { - return r.addMatcher(f) -} - -// Methods -------------------------------------------------------------------- - -// methodMatcher matches the request against HTTP methods. -type methodMatcher []string - -func (m methodMatcher) Match(r *http.Request, match *RouteMatch) bool { - return matchInArray(m, r.Method) -} - -// Methods adds a matcher for HTTP methods. -// It accepts a sequence of one or more methods to be matched, e.g.: -// "GET", "POST", "PUT". -func (r *Route) Methods(methods ...string) *Route { - for k, v := range methods { - methods[k] = strings.ToUpper(v) - } - return r.addMatcher(methodMatcher(methods)) -} - -// Path ----------------------------------------------------------------------- - -// Path adds a matcher for the URL path. -// It accepts a template with zero or more URL variables enclosed by {}. The -// template must start with a "/". -// Variables can define an optional regexp pattern to me matched: -// -// - {name} matches anything until the next slash. -// -// - {name:pattern} matches the given regexp pattern. -// -// For example: -// -// r := mux.NewRouter() -// r.Path("/products/").Handler(ProductsHandler) -// r.Path("/products/{key}").Handler(ProductsHandler) -// r.Path("/articles/{category}/{id:[0-9]+}"). -// Handler(ArticleHandler) -// -// Variable names must be unique in a given route. They can be retrieved -// calling mux.Vars(request). -func (r *Route) Path(tpl string) *Route { - r.err = r.addRegexpMatcher(tpl, false, false, false) - return r -} - -// PathPrefix ----------------------------------------------------------------- - -// PathPrefix adds a matcher for the URL path prefix. This matches if the given -// template is a prefix of the full URL path. See Route.Path() for details on -// the tpl argument. -// -// Note that it does not treat slashes specially ("/foobar/" will be matched by -// the prefix "/foo") so you may want to use a trailing slash here. -// -// Also note that the setting of Router.StrictSlash() has no effect on routes -// with a PathPrefix matcher. -func (r *Route) PathPrefix(tpl string) *Route { - r.err = r.addRegexpMatcher(tpl, false, true, false) - return r -} - -// Query ---------------------------------------------------------------------- - -// Queries adds a matcher for URL query values. -// It accepts a sequence of key/value pairs. Values may define variables. -// For example: -// -// r := mux.NewRouter() -// r.Queries("foo", "bar", "id", "{id:[0-9]+}") -// -// The above route will only match if the URL contains the defined queries -// values, e.g.: ?foo=bar&id=42. -// -// It the value is an empty string, it will match any value if the key is set. -// -// Variables can define an optional regexp pattern to me matched: -// -// - {name} matches anything until the next slash. -// -// - {name:pattern} matches the given regexp pattern. -func (r *Route) Queries(pairs ...string) *Route { - length := len(pairs) - if length%2 != 0 { - r.err = fmt.Errorf( - "mux: number of parameters must be multiple of 2, got %v", pairs) - return nil - } - for i := 0; i < length; i += 2 { - if r.err = r.addRegexpMatcher(pairs[i]+"="+pairs[i+1], false, true, true); r.err != nil { - return r - } - } - - return r -} - -// Schemes -------------------------------------------------------------------- - -// schemeMatcher matches the request against URL schemes. -type schemeMatcher []string - -func (m schemeMatcher) Match(r *http.Request, match *RouteMatch) bool { - return matchInArray(m, r.URL.Scheme) -} - -// Schemes adds a matcher for URL schemes. -// It accepts a sequence of schemes to be matched, e.g.: "http", "https". -func (r *Route) Schemes(schemes ...string) *Route { - for k, v := range schemes { - schemes[k] = strings.ToLower(v) - } - return r.addMatcher(schemeMatcher(schemes)) -} - -// Subrouter ------------------------------------------------------------------ - -// Subrouter creates a subrouter for the route. -// -// It will test the inner routes only if the parent route matched. For example: -// -// r := mux.NewRouter() -// s := r.Host("www.domain.com").Subrouter() -// s.HandleFunc("/products/", ProductsHandler) -// s.HandleFunc("/products/{key}", ProductHandler) -// s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) -// -// Here, the routes registered in the subrouter won't be tested if the host -// doesn't match. -func (r *Route) Subrouter() *Router { - router := &Router{parent: r, strictSlash: r.strictSlash} - r.addMatcher(router) - return router -} - -// ---------------------------------------------------------------------------- -// URL building -// ---------------------------------------------------------------------------- - -// URL builds a URL for the route. -// -// It accepts a sequence of key/value pairs for the route variables. For -// example, given this route: -// -// r := mux.NewRouter() -// r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler). -// Name("article") -// -// ...a URL for it can be built using: -// -// url, err := r.Get("article").URL("category", "technology", "id", "42") -// -// ...which will return an url.URL with the following path: -// -// "/articles/technology/42" -// -// This also works for host variables: -// -// r := mux.NewRouter() -// r.Host("{subdomain}.domain.com"). -// HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler). -// Name("article") -// -// // url.String() will be "http://news.domain.com/articles/technology/42" -// url, err := r.Get("article").URL("subdomain", "news", -// "category", "technology", -// "id", "42") -// -// All variables defined in the route are required, and their values must -// conform to the corresponding patterns. -func (r *Route) URL(pairs ...string) (*url.URL, error) { - if r.err != nil { - return nil, r.err - } - if r.regexp == nil { - return nil, errors.New("mux: route doesn't have a host or path") - } - var scheme, host, path string - var err error - if r.regexp.host != nil { - // Set a default scheme. - scheme = "http" - if host, err = r.regexp.host.url(pairs...); err != nil { - return nil, err - } - } - if r.regexp.path != nil { - if path, err = r.regexp.path.url(pairs...); err != nil { - return nil, err - } - } - return &url.URL{ - Scheme: scheme, - Host: host, - Path: path, - }, nil -} - -// URLHost builds the host part of the URL for a route. See Route.URL(). -// -// The route must have a host defined. -func (r *Route) URLHost(pairs ...string) (*url.URL, error) { - if r.err != nil { - return nil, r.err - } - if r.regexp == nil || r.regexp.host == nil { - return nil, errors.New("mux: route doesn't have a host") - } - host, err := r.regexp.host.url(pairs...) - if err != nil { - return nil, err - } - return &url.URL{ - Scheme: "http", - Host: host, - }, nil -} - -// URLPath builds the path part of the URL for a route. See Route.URL(). -// -// The route must have a path defined. -func (r *Route) URLPath(pairs ...string) (*url.URL, error) { - if r.err != nil { - return nil, r.err - } - if r.regexp == nil || r.regexp.path == nil { - return nil, errors.New("mux: route doesn't have a path") - } - path, err := r.regexp.path.url(pairs...) - if err != nil { - return nil, err - } - return &url.URL{ - Path: path, - }, nil -} - -// ---------------------------------------------------------------------------- -// parentRoute -// ---------------------------------------------------------------------------- - -// parentRoute allows routes to know about parent host and path definitions. -type parentRoute interface { - getNamedRoutes() map[string]*Route - getRegexpGroup() *routeRegexpGroup -} - -// getNamedRoutes returns the map where named routes are registered. -func (r *Route) getNamedRoutes() map[string]*Route { - if r.parent == nil { - // During tests router is not always set. - r.parent = NewRouter() - } - return r.parent.getNamedRoutes() -} - -// getRegexpGroup returns regexp definitions from this route. -func (r *Route) getRegexpGroup() *routeRegexpGroup { - if r.regexp == nil { - if r.parent == nil { - // During tests router is not always set. - r.parent = NewRouter() - } - regexp := r.parent.getRegexpGroup() - if regexp == nil { - r.regexp = new(routeRegexpGroup) - } else { - // Copy. - r.regexp = &routeRegexpGroup{ - host: regexp.host, - path: regexp.path, - queries: regexp.queries, - } - } - } - return r.regexp -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/.gitignore b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/.gitignore deleted file mode 100644 index ea9f6bc3c..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*.o -*.a -*.so -*~ -*.dSYM -*.syso \ No newline at end of file diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/BUILDDEPS.md b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/BUILDDEPS.md deleted file mode 100644 index df3770b29..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/BUILDDEPS.md +++ /dev/null @@ -1,80 +0,0 @@ -## Ubuntu (Kylin) 14.04 -### Build Dependencies -This installation document assumes Ubuntu 14.04 or later on x86-64 platform. - -##### Install YASM - -Erasure depends on Intel ISAL library, ISAL uses Intel AVX2 processor instructions, to compile these files one needs to install ``yasm`` which supports AVX2 instructions. AVX2 support only ended in ``yasm`` from version ``1.2.0``, any version below ``1.2.0`` will throw a build error. - -```sh -$ sudo apt-get install yasm -``` - -##### Install Go 1.4+ -Download Go 1.4+ from [https://golang.org/dl/](https://golang.org/dl/) and extract it into ``${HOME}/local`` and setup ``${HOME}/mygo`` as your project workspace folder. -For example: -```sh -.... Extract and install golang .... - -$ wget https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz -$ mkdir -p ${HOME}/local -$ mkdir -p $HOME/mygo -$ tar -C ${HOME}/local -xzf go1.4.linux-amd64.tar.gz - -.... Export necessary environment variables .... - -$ export PATH=$PATH:${HOME}/local/go/bin -$ export GOROOT=${HOME}/local/go -$ export GOPATH=$HOME/mygo -$ export PATH=$PATH:$GOPATH/bin - -.... Add paths to your bashrc .... - -$ echo "export PATH=$PATH:${HOME}/local/go/bin" >> ${HOME}/.bashrc -$ echo "export GOROOT=${HOME}/local/go" >> ${HOME}/.bashrc -$ echo "export GOPATH=$HOME/mygo" >> ${HOME}/.bashrc -$ echo "export PATH=$PATH:$GOPATH/bin" >> ${HOME}/.bashrc -``` - -## Mac OSX (Yosemite) 10.10 -### Build Dependencies -This installation document assumes Mac OSX Yosemite 10.10 or later on x86-64 platform. - -##### Install brew -```sh -$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -``` - -##### Install Git -```sh -$ brew install git -``` - -##### Install YASM - -Erasure depends on Intel ISAL library, ISAL uses Intel AVX2 processor instructions, to compile these files one needs to install ``yasm`` which supports AVX2 instructions. AVX2 support only ended in ``yasm`` from version ``1.2.0``, any version below ``1.2.0`` will throw a build error. - -```sh -$ brew install yasm -``` - -##### Install Go 1.4+ -On MacOSX ``brew.sh`` is the best way to install golang - -For example: -```sh -.... Install golang using `brew` .... - -$ brew install go -$ mkdir -p $HOME/mygo - -.... Export necessary environment variables .... - -$ export GOPATH=$HOME/mygo -$ export PATH=$PATH:$GOPATH/bin - -.... Add paths to your bashrc .... - -$ echo "export GOPATH=$HOME/mygo" >> ${HOME}/.bashrc -$ echo "export PATH=$PATH:$GOPATH/bin" >> ${HOME}/.bashrc -``` diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/CONTRIBUTING.md b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/CONTRIBUTING.md deleted file mode 100644 index 1dfc6a0cb..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/CONTRIBUTING.md +++ /dev/null @@ -1,30 +0,0 @@ -### Setup your Erasure Github Repository -Fork [Erasure upstream](https://github.com/minio-io/erasure/fork) source repository to your own personal repository. Copy the URL and pass it to ``go get`` command. Go uses git to clone a copy into your project workspace folder. -```sh -$ git clone https://github.com/$USER_ID/erasure -$ cd erasure -$ mkdir -p ${GOPATH}/src/github.com/minio-io -$ ln -s ${PWD} $GOPATH/src/github.com/minio-io/ -``` - -### Compiling Erasure from source -```sh -$ go generate -$ go build -``` -### Developer Guidelines -To make the process as seamless as possible, we ask for the following: -* Go ahead and fork the project and make your changes. We encourage pull requests to discuss code changes. - - Fork it - - Create your feature branch (git checkout -b my-new-feature) - - Commit your changes (git commit -am 'Add some feature') - - Push to the branch (git push origin my-new-feature) - - Create new Pull Request -* When you're ready to create a pull request, be sure to: - - Have test cases for the new code. If you have questions about how to do it, please ask in your pull request. - - Run `go fmt` - - Squash your commits into a single commit. `git rebase -i`. It's okay to force update your pull request. - - Make sure `go test -race ./...` and `go build` completes. -* Read [Effective Go](https://github.com/golang/go/wiki/CodeReviewComments) article from Golang project - - `Erasure` project is strictly conformant with Golang style - - if you happen to observe offending code, please feel free to send a pull request diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.INTEL b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.INTEL deleted file mode 100644 index 667056695..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.INTEL +++ /dev/null @@ -1,26 +0,0 @@ - Copyright(c) 2011-2014 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.MINIO b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.MINIO deleted file mode 100644 index d64569567..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/LICENSE.MINIO +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/README.md b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/README.md deleted file mode 100644 index cafa80eb3..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/README.md +++ /dev/null @@ -1,25 +0,0 @@ -## Introduction - -Erasure is an open source Golang library written on top of ISAL (Intel Intelligent Storage Library) released under [Apache license v2](./LICENSE) - -### Developers -* [Get Source](./CONTRIBUTING.md) -* [Build Dependencies](./BUILDDEPS.md) -* [Development Workflow](./CONTRIBUTING.md#developer-guidelines) -* [Developer discussions and bugs](https://github.com/Minio-io/erasure/issues) - -### Supported platforms - -| Name | Supported | -| ------------- | ------------- | -| Linux | Yes | -| Windows | Not yet | -| Mac OSX | Yes | - -### Supported architectures - -| Arch | Supported | -| ------------- | ------------- | -| x86-64 | Yes | -| arm64 | Not yet| -| i386 | Never | diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.INTEL b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.INTEL deleted file mode 100644 index b4b601824..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.INTEL +++ /dev/null @@ -1,49 +0,0 @@ -================================================================================ -v2.10 Intel Intelligent Storage Acceleration Library Release Notes - Open Source Version -================================================================================ - -================================================================================ -RELEASE NOTE CONTENTS -================================================================================ -1. KNOWN ISSUES -2. FIXED ISSUES -3. CHANGE LOG & FEATURES ADDED - -================================================================================ -1. KNOWN ISSUES -================================================================================ - -* Only erasure code unit included in open source version at this time. - -* Perf tests do not run in Windows environment. - -* Leaving /bin directories from builds in unit directories will cause the - top-level make build to fail. Build only in top-level or ensure unit - directories are clean of objects and /bin. - -* 32-bit lib is not supported in Windows. - -================================================================================ -2. FIXED ISSUES -================================================================================ -v2.10 - -* Fix for windows register save overlap in gf_{3-6}vect_dot_prod_sse.asm. Only - affects windows versions of erasure code. GP register saves/restore were - pushed to same stack area as XMM. - -================================================================================ -3. CHANGE LOG & FEATURES ADDED -================================================================================ -v2.10 - -* Erasure code updates - - New AVX and AVX2 support functions. - - Changes min len requirement on gf_vect_dot_prod() to 32 from 16. - - Tests include both source and parity recovery with ec_encode_data(). - - New encoding examples with Vandermonde or Cauchy matrix. - -v2.8 - -* First open release of erasure code unit that is part of ISA-L. diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.MINIO b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.MINIO deleted file mode 100644 index bf3ed1ece..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/RELEASE-NOTES.MINIO +++ /dev/null @@ -1,3 +0,0 @@ -v1.0 - Erasure Golang Package -============================ -- First release, supports only amd64 or x86-64 architecture \ No newline at end of file diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/cauchy_test.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/cauchy_test.go deleted file mode 100644 index 37f28c74c..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/cauchy_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -import ( - "bytes" - "testing" - - . "gopkg.in/check.v1" -) - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func Test(t *testing.T) { TestingT(t) } - -const ( - k = 10 - m = 5 -) - -func (s *MySuite) TestCauchyEncodeDecodeFailure(c *C) { - ep, _ := ValidateParams(k, m, Cauchy) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 11, 13} - chunks = corruptChunks(chunks, errorIndex) - - _, err = e.Decode(chunks, len(data)) - c.Assert(err, Not(IsNil)) -} - -func (s *MySuite) TestCauchyEncodeDecodeSuccess(c *C) { - ep, _ := ValidateParams(k, m, Cauchy) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 13} - chunks = corruptChunks(chunks, errorIndex) - - recoveredData, err := e.Decode(chunks, len(data)) - c.Assert(err, IsNil) - - if !bytes.Equal(data, recoveredData) { - c.Fatalf("Recovered data mismatches with original data") - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ctypes.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ctypes.go deleted file mode 100644 index da04076fc..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ctypes.go +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -// #include -import "C" -import ( - "fmt" - "unsafe" -) - -// intSlice2CIntArray converts Go int slice to C int array -func intSlice2CIntArray(srcErrList []int) *C.int32_t { - var sizeErrInt = int(unsafe.Sizeof(srcErrList[0])) - switch sizeInt { - case sizeErrInt: - return (*C.int32_t)(unsafe.Pointer(&srcErrList[0])) - case sizeInt8: - int8Array := make([]int8, len(srcErrList)) - for i, v := range srcErrList { - int8Array[i] = int8(v) - } - return (*C.int32_t)(unsafe.Pointer(&int8Array[0])) - case sizeInt16: - int16Array := make([]int16, len(srcErrList)) - for i, v := range srcErrList { - int16Array[i] = int16(v) - } - return (*C.int32_t)(unsafe.Pointer(&int16Array[0])) - case sizeInt32: - int32Array := make([]int32, len(srcErrList)) - for i, v := range srcErrList { - int32Array[i] = int32(v) - } - return (*C.int32_t)(unsafe.Pointer(&int32Array[0])) - case sizeInt64: - int64Array := make([]int64, len(srcErrList)) - for i, v := range srcErrList { - int64Array[i] = int64(v) - } - return (*C.int32_t)(unsafe.Pointer(&int64Array[0])) - default: - panic(fmt.Sprintf("Unsupported: %d", sizeInt)) - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/doc.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/doc.go deleted file mode 100644 index ce47fb64d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/doc.go +++ /dev/null @@ -1,67 +0,0 @@ -// Package erasure is a Go wrapper for the Intel Intelligent Storage -// Acceleration Library (Intel ISA-L). Intel ISA-L is a CPU optimized -// implementation of erasure coding algorithms. -// -// For more information on Intel ISA-L, please visit: -// https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version -// -// Usage: -// -// Encode encodes a block of data. The input is the original data. The output -// is a 2 tuple containing (k + m) chunks of erasure encoded data and the -// length of the original object. -// -// Decode decodes 2 tuple data containing (k + m) chunks back into its original form. -// Additionally original block length should also be provided as input. -// -// Decoded data is exactly similar in length and content as the original data. -// -// Encoding data may be performed in 3 steps. -// -// 1. Create a parse set of encoder parameters -// 2. Create a new encoder -// 3. Encode data -// -// Decoding data is also performed in 3 steps. -// -// 1. Create a parse set of encoder parameters for validation -// 2. Create a new encoder -// 3. Decode data -// -// Erasure parameters contain three configurable elements: -// ValidateParams(k, m, technique int) (ErasureParams, error) -// k - Number of rows in matrix -// m - Number of colums in matrix -// technique - Matrix type, can be either Cauchy (recommended) or Vandermonde -// constraints: k + m < Galois Field (2^8) -// -// Choosing right parity and matrix technique is left for application to decide. -// -// But here are the few points to keep in mind -// -// Techniques: -// - Vandermonde is most commonly used method for choosing coefficients in erasure -// encoding but does not guarantee invertable for every sub matrix. -// Users may want to adjust for k > 5. (k is data blocks) -// - Whereas Cauchy is our recommended method for choosing coefficients in erasure coding. -// Since any sub-matrix of a Cauchy matrix is invertable. -// -// Total blocks: -// - Data blocks and Parity blocks should not be greater than 'Galois Field' (2^8) -// -// Example -// -// Creating and using an encoder -// var bytes []byte -// params := erasure.ValidateParams(10, 5, erasure.Cauchy) -// encoder := erasure.NewErasure(params) -// encodedData, length := encoder.Encode(bytes) -// -// Creating and using a decoder -// var encodedData [][]byte -// var length int -// params := erasure.ValidateParams(10, 5, erasure.Cauchy) -// encoder := erasure.NewErasure(params) -// originalData, err := encoder.Decode(encodedData, length) -// -package erasure diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.10.pdf b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.10.pdf deleted file mode 100644 index b2d6e1447..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.10.pdf +++ /dev/null @@ -1,5429 +0,0 @@ -%PDF-1.4 -%ÐÔÅØ -5 0 obj -<< /S /GoTo /D (chapter.1) >> -endobj -8 0 obj -(\376\377\000S\000t\000o\000r\000a\000g\000e\000\040\000L\000i\000b\000r\000a\000r\000y) -endobj -9 0 obj -<< /S /GoTo /D (section.1.1) >> -endobj -12 0 obj -(\376\377\000A\000b\000o\000u\000t\000\040\000T\000h\000i\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t) -endobj -13 0 obj -<< /S /GoTo /D (section.1.2) >> -endobj -16 0 obj -(\376\377\000O\000v\000e\000r\000v\000i\000e\000w) -endobj -17 0 obj -<< /S /GoTo /D (section.1.3) >> -endobj -20 0 obj -(\376\377\000E\000r\000a\000s\000u\000r\000e\000\040\000C\000o\000d\000e\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000s) -endobj -21 0 obj -<< /S /GoTo /D (section.1.4) >> -endobj -24 0 obj -(\376\377\000S\000y\000s\000t\000e\000m\000\040\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s) -endobj -25 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -28 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s) -endobj -29 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -32 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s) -endobj -33 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -36 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s\000\040\000T\000a\000b\000l\000e\000s) -endobj -37 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -40 0 obj -(\376\377\000I\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000\040\000S\000e\000t\000\040\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s) -endobj -41 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -44 0 obj -(\376\377\000F\000i\000l\000e\000\040\000I\000n\000d\000e\000x) -endobj -45 0 obj -<< /S /GoTo /D (section.4.1) >> -endobj -48 0 obj -(\376\377\000F\000i\000l\000e\000\040\000L\000i\000s\000t) -endobj -49 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -52 0 obj -(\376\377\000F\000i\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -53 0 obj -<< /S /GoTo /D (section.5.1) >> -endobj -56 0 obj -(\376\377\000e\000r\000a\000s\000u\000r\000e\000\137\000c\000o\000d\000e\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -57 0 obj -<< /S /GoTo /D (subsection.5.1.1) >> -endobj -60 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -61 0 obj -<< /S /GoTo /D (subsection.5.1.2) >> -endobj -64 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -65 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.1) >> -endobj -68 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a) -endobj -69 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.2) >> -endobj -72 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a\000\137\000b\000a\000s\000e) -endobj -73 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.3) >> -endobj -76 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a\000\137\000s\000s\000e) -endobj -77 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.4) >> -endobj -80 0 obj -(\376\377\000e\000c\000\137\000i\000n\000i\000t\000\137\000t\000a\000b\000l\000e\000s) -endobj -81 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.5) >> -endobj -84 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -85 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.6) >> -endobj -88 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -89 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.7) >> -endobj -92 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -93 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.8) >> -endobj -96 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -97 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.9) >> -endobj -100 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -101 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.10) >> -endobj -104 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -105 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.11) >> -endobj -108 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -109 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.12) >> -endobj -112 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -113 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.13) >> -endobj -116 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -117 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.14) >> -endobj -120 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -121 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.15) >> -endobj -124 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -125 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.16) >> -endobj -128 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -129 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.17) >> -endobj -132 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -133 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.18) >> -endobj -136 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -137 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.19) >> -endobj -140 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -141 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.20) >> -endobj -144 0 obj -(\376\377\000g\000f\000\137\000g\000e\000n\000\137\000c\000a\000u\000c\000h\000y\0001\000\137\000m\000a\000t\000r\000i\000x) -endobj -145 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.21) >> -endobj -148 0 obj -(\376\377\000g\000f\000\137\000g\000e\000n\000\137\000r\000s\000\137\000m\000a\000t\000r\000i\000x) -endobj -149 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.22) >> -endobj -152 0 obj -(\376\377\000g\000f\000\137\000i\000n\000v) -endobj -153 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.23) >> -endobj -156 0 obj -(\376\377\000g\000f\000\137\000i\000n\000v\000e\000r\000t\000\137\000m\000a\000t\000r\000i\000x) -endobj -157 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.24) >> -endobj -160 0 obj -(\376\377\000g\000f\000\137\000m\000u\000l) -endobj -161 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.25) >> -endobj -164 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d) -endobj -165 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.26) >> -endobj -168 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -169 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.27) >> -endobj -172 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -173 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.28) >> -endobj -176 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000b\000a\000s\000e) -endobj -177 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.29) >> -endobj -180 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -181 0 obj -<< /S /GoTo /D (section.5.2) >> -endobj -184 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -185 0 obj -<< /S /GoTo /D (subsection.5.2.1) >> -endobj -188 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -189 0 obj -<< /S /GoTo /D (subsection.5.2.2) >> -endobj -192 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -193 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.1) >> -endobj -196 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l) -endobj -197 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.2) >> -endobj -200 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000a\000v\000x) -endobj -201 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.3) >> -endobj -204 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000b\000a\000s\000e) -endobj -205 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.4) >> -endobj -208 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000i\000n\000i\000t) -endobj -209 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.5) >> -endobj -212 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000s\000s\000e) -endobj -213 0 obj -<< /S /GoTo /D (section.5.3) >> -endobj -216 0 obj -(\376\377\000t\000y\000p\000e\000s\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -217 0 obj -<< /S /GoTo /D (subsection.5.3.1) >> -endobj -220 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -221 0 obj -<< /S /GoTo /D [222 0 R /Fit ] >> -endobj -225 0 obj << -/Length 384 -/Filter /FlateDecode ->> -stream -xÚSËNÃ0¼ç+ö˜HØxýö±ˆ‡Š@@q)=„6E•ÒLâﱓ"Ô^P$¯2žÌŒ7k/Àà*a*†•‚”CŠÜÀj—¼ýlÄõp:Ý!œ7ÉCxe…F…ÑR‡ª•µ>xÙšýZ“èMFægyrz)8ð@Ö\A¾ÃA¡¢‘™¯a‘N붬²e~ÝQR!5DÉ©´ •ÎõÔ'®ôs$‰šZT@FÔNµÚ¾dYZÖmF¸±é¼m|‘dÀ{t²Z•Ué‹vÛÔ=r³}ö…ï8_Ñ0ž‰rg€pA•C¦ØñôŽ -ýïôó ¹ òØǹ{-‡`óæÃgœ¥«!úc¦Â1|†*}é÷òŽ:ÍuT'ZS41y¨|èùä~Ú?+7±¥/ë½ämQG裨úwrØ©9E=“‹|4VáËÐ/-â,– Ö¾Žsã,|v¤HmC­`†®Ÿ5J%$RËÌøÕo‡<ödðf(;ovä>„Lßì;·— -endstream -endobj -222 0 obj << -/Type /Page -/Contents 225 0 R -/Resources 224 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R ->> endobj -223 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./intel_4c_100.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 230 0 R -/BBox [0 0 102 77] -/Resources << -/ProcSet [ /PDF ] -/ExtGState << -/R7 231 0 R ->>>> -/Length 232 0 R -/Filter /FlateDecode ->> -stream -xœmWI²5Ü×)t!½AÃ1à -`"h/€ÎO¦¦*÷wxQ?³%½9%ÿRÌ!ñßú¾¾_¿üV÷/਽÷$ㇿ.k-z+!÷‹yø~©•¨ÉCn]ðC‹)µ Écî k¢4cY«áuåRcª`jÆŠŽÜ‚I*D&Mׂ„ÞA" \oùÆ´«ÜŒ£Á=Ã-( õó`¨‡'Îèf F©^!~øEúRrŽal 7G§Ù½•)¸iÿ©µÅÑÂe«Øgb"ŠíÆvte¦9ÛÙ7áT]  e Ük˜ØIÁ|vçàãƒõ¹ I4A!ÔŽÝÃ1Ù1§Î$±¼c6'X*÷:•µãè->|¤Êh[s°ú£û—Áf,Í„ÒqVó`ØÀ$p–ÃΓ1;fPTåW†»J±'#e”ÚpéÀå1\è^˜}#H¸P£í1{›¹m(T—÷ÔWæžÆÏx9%•­Â³™açí]QÖ)ÛÌÖsê3‹xp÷qYߊïT|d|Ÿ°UuÛØ;Po-·îVˆ!'ðÃÆf¶ë„ãåG¼:]è¿CSòÊa*e‰wÈ2Ÿ?ìn¦1FÆ6O è6¼+n»cGí+kEóÑË焱Mæx±N8^~Ä1cí_f>8ˆ r0†|1ïÁTm‡!æÍKÌËŠxÜÀ¥–Ọ¿¬ëе÷`óE&3ïÀbsÄc2æó~¿WÌGÏÆÿaEÂý›+ÐýRÀ¦?9‰Uû÷“ »„B¹ÙB„[º1Ë8å⑲«=öÊó9ò†}<ÿÁMc¾‹5Îë|ŽáÆGBh‘ºNLiã ¢˜ÃËc'†¸ÌÌ*žh ¾NAÏï¨xªsFr9ØzÍΛÌ4ô~0e¨d­{vm¼ÅhbLQ×õ,®-­§@¯7¸þAa˜:zñÆ|ÏÌ#6ã}®g¦?Zw¶3žéUN0ßã¼G¸>Bàð)±[uãÙ¼3{EÂïaß;ÒÑç -Ó fùØ@†ù¤’¾Ï›ÙN œ=Ü51ϘÜ+vèó?7žU|}Iu;…oׯ×ÿ^§ -endstream -endobj -230 0 obj -<< -/Producer (GPL Ghostscript 8.71) -/CreationDate (D:20100929095736-07'00') -/ModDate (D:20100929095736-07'00') -/Creator (Adobe Illustrator\(R\) 8.0) -/Author (\(L.P Thebault\) \(L.P. Thebault Company\)) -/Title (\(intel_4c_100.eps\)) ->> -endobj -231 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -232 0 obj -1336 -endobj -226 0 obj << -/D [222 0 R /XYZ 72 668.127 null] ->> endobj -224 0 obj << -/Font << /F32 227 0 R /F35 228 0 R >> -/XObject << /Im1 223 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -236 0 obj << -/Length 1840 -/Filter /FlateDecode ->> -stream -xÚ¥XQs£F ~ϯ`“À€í¾ù0‰¹:¶ ¸éMÛŒ71= >Àͤ¿¾ÒJkÇw3>í®¤•¾Õ'-^›Ú³fj÷W¦aö­þ@3þÀs<=w8´´ÔßPE°ëíþ˜\ÝÞhdŒ<ÛÓ’'Íí»†i4o82–£%íwÝêý™|:† -’«¯WLMÍÒ6˜ºÆÈjÙîê÷?MmòOl4Ô^¤ÕNs¼!Œ…_ýrtC±ÚÀ L cƒ/×´ 6Ê°áün=Œ{–eéI¸˜÷núÞ¤4&Ó0¦ÙdᯂyÂz–.£žcê‹žk꿆“`ÒÝ=ÒýÅ|ø'¯a2UI0{ãb²ò“Ø Ñ|Aã,ôƒy\Ó*øm1^D"|èYú ¦Î{32Ó¹œ…ÁvÚÎ@ÿø™Æ Nzì].18JÐC2 ¢žëLÓvàüÒžlÆsv#ÁÏà`+Ü5fW|Ž%øðÀÛFáý4‰y÷Ñ -¦ôw2½ ‹Wþ”D]š®»n¥vÇ€™ÁHúd”ñÇpb*Pü8å*‹Á¯AÄNÆóÉöصÝ7õIû³qøÓ’X°G§r@©äÆðAòN‹ÇžeÆÓýæ#ýšQ0S?¿'Ñ‘h˜ÇãY@1Ü­r½Â|ÉXw넱›¥ôg« `é÷xë¦Æ&ø}Ûzƒ8”é´ß¡E;…Õwa2§¶‡>h½DÖÇT‘¡¿šY½\EËuX=‘?…½0ɸ8]]tpUD!À–ÃRyO›L«H‚ Å'ô\ÒפñËϲ9h)³Œã±åòB«¹æ¥V)y“MÃÈ,×°ú m5ŸQ–,ç}·“øØZSû8úcrêañQV³KÈ®I®Ôîç¬$¤ûˆ­æŸ“ ïç*äœ<Í'J|§Ä˜Ø÷i/¡êýînL ߆+òqb£HEÙæiÎVˆ 5’9PÅàTÝ ë…tþb5›ÎE/éÆ$C¦ì Ô#d1}1ˆû.ñ*c~Z¥®þ™AEZg¢N‰vüv™´ëÇ÷WÑÅËV`4ìë»ôUM¾Àf]àÊѳmZ>‹†TmEc³Yþ‡iÚYÚæUÉÚ´ÜÐd_W›CÖ’ƒh²:ßwíZe߃šá¨m¾ØÐ/y»­lTVmž ¸òÀ4Mþ\ŠšíÍÉŠ&µ(^)nU²ã­àpëF”/ªšF8^f—¾•­¨óbc¬«WO8:Ð |i{¨…2©É$/›¶†óó‰A³KkÊé†Ö`¨ÿFObóvÑnÐÊÀÜ–bc| ™¢ Ì:;Ù9°ŒGAx: .²·ñ„ˆ³f›ɶin5rL’²¢"îñ$–ž¯ó"o_/ÔßË6m›Jôl—] ·Ï€\[ϪPôó¬mH£y™U»=”‘ô V§ü¼|&›§ºÚ±?u.ty¬L—+„Œþ`‚OA"‰]^ŒàO9 ÛŠZiÚÙÖ Y´wƒd§²ű,1Ò¤: -/’Ì~ZäÿêÆ”†¬eš£kšµ[Âc2j ùbëÊãõ‡–ê¶W6·Û+ •yIbò‹’M•v¢lI.»Å@P›*k…MÚ‹'qôŽ¬¡PÔuU³ì  -ðþÂö)‹Á$mS’½lól{0=4B{{–V -€,«> endobj -233 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [135.019 309.334 337.859 318.456] -/Subtype/Link/A<> ->> endobj -234 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -275 0 obj << -/Length 824 -/Filter /FlateDecode ->> -stream -xÚíšKo›@…÷ù³„tÞ3,Û¼”*j¥Äê&ª†I‚C -8Mþ}ÇfŒM° ÔQ"Vƶ†çœ{/Q ¸œAóúmrôåŒr€©+¤@`r ̃.L"pc§I¡’"·O¾ëu -/.®ÎËåžëqÌ«!p8r÷ÊÅÈv„к.Ò,¸S¶ƒ´.ãid/æ†åAåÄ…ÈÓoÌÂÛ‰íJ¥ B®Ç˜Yì.÷Õ[}¦ó¢ÜurçåÕIÎgú'Õp£¿ã–k;LŸ÷°^¨ç½û=‘Àb§J ÔÁFŸO6b–Êžbecfý}­ðÄajðI2ýŸZĨušù<3±=N#su6OÂ"N“üµz„ŽÒ¼»Ôˆqý’jV*p¥þÌãLÍ6 -s%ecLúi»õ6Q×£8Xëƒd©6n•‰RŸ_¶þP—¹¼úäÇ|6Õï[›Ù§éáªé5Ž‚ÐÛG¹q¸ £EvY„tŒ+®:]WÊáÄ–Ð -¦ª¡Š$b°,ÉÓ=ÂIL8/’¼Èær\«b³ÚHZÛ‹)ÁDR‹µ¨¿¹]ƒøÁ´Ê‹$RÏ­¡û„ž®C_myçÑ–I9رꃦ+±‡OYÃ7«g”`éÙ6ÿÈ}üÃ*ÿ¨rÔóC=å¹÷fΫŽs¥nU¦’P5Êâ£3Ö&Ø%ÀX«Mð—ø±¾Á‰*M;2ê«<ÌâǦöºK{#ð:w¼˜¦á[ý™¯™cüޡ[§ë'–#çVιR¢¦Á˱”,*Lèë -¢Ë‹EÐxðçô {Ä;X¸Fo¥êOƒ¼Q£ÅŸJõ¢H¶SÌ›Ńsd?–tÍ2NâÂ/¶?ÏP6„‘ðm¸¸\fàÞÝú¸üjXøQZøYù¡õôܘAÖ[¿Ë»€Ä ×JtÈI//ŠV„[j§$d>ìQ®!’1Ð5´H¯ È¡ºB=z:r'ÂÁšõj,zZZA¤c k y?7â ‡èžIÂÁZôƒH+ˆl ô> YC ´ì‡·!l ½~ZTùè­ ëÿx:9ú^Vý× -endstream -endobj -274 0 obj << -/Type /Page -/Contents 275 0 R -/Resources 273 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R ] ->> endobj -240 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 525.49 156.841 536.369] -/Subtype /Link -/A << /S /GoTo /D (chapter.1) >> ->> endobj -241 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 515.457 199.959 524.304] -/Subtype /Link -/A << /S /GoTo /D (section.1.1) >> ->> endobj -242 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 503.502 149.738 512.349] -/Subtype /Link -/A << /S /GoTo /D (section.1.2) >> ->> endobj -243 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 491.547 206.594 500.394] -/Subtype /Link -/A << /S /GoTo /D (section.1.3) >> ->> endobj -244 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 477.535 198.026 488.439] -/Subtype /Link -/A << /S /GoTo /D (section.1.4) >> ->> endobj -245 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 457.654 202.619 466.63] -/Subtype /Link -/A << /S /GoTo /D (chapter.2) >> ->> endobj -246 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 445.719 218.221 454.566] -/Subtype /Link -/A << /S /GoTo /D (section.2.1) >> ->> endobj -247 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 433.764 246.474 442.61] -/Subtype /Link -/A << /S /GoTo /D (section.2.2) >> ->> endobj -248 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 409.923 213.388 420.802] -/Subtype /Link -/A << /S /GoTo /D (chapter.3) >> ->> endobj -249 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 389.908 130.839 398.884] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -250 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 377.973 144.348 386.82] -/Subtype /Link -/A << /S /GoTo /D (section.4.1) >> ->> endobj -251 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 356.035 171.785 365.011] -/Subtype /Link -/A << /S /GoTo /D (chapter.5) >> ->> endobj -252 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 343.019 231.74 352.947] -/Subtype /Link -/A << /S /GoTo /D (section.5.1) >> ->> endobj -253 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 330.087 225.463 340.991] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.1.1) >> ->> endobj -254 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 320.19 242.081 329.036] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.1.2) >> ->> endobj -255 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 307.153 247.203 317.081] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.1) >> ->> endobj -256 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 295.198 269.887 305.126] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.2) >> ->> endobj -257 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 283.243 264.358 293.171] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.3) >> ->> endobj -258 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 271.288 238.923 281.216] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.4) >> ->> endobj -259 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 258.356 278.416 269.26] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.5) >> ->> endobj -260 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 246.401 283.397 257.305] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.6) >> ->> endobj -261 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 234.446 276.403 245.35] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.7) >> ->> endobj -262 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 222.491 278.416 233.395] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.8) >> ->> endobj -263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 210.536 283.397 221.44] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.9) >> ->> endobj -264 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 198.581 276.403 209.485] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.10) >> ->> endobj -265 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 186.625 278.416 197.529] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.11) >> ->> endobj -266 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 174.67 283.397 185.574] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.12) >> ->> endobj -267 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 162.715 276.403 173.619] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.13) >> ->> endobj -268 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 150.76 278.416 161.664] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.14) >> ->> endobj -269 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 138.805 283.397 149.709] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.15) >> ->> endobj -270 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 126.85 276.403 137.754] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.16) >> ->> endobj -271 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 114.894 278.416 125.798] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.17) >> ->> endobj -273 0 obj << -/Font << /F46 237 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -299 0 obj << -/Length 690 -/Filter /FlateDecode ->> -stream -xÚíÙMs¢0ð;Ÿ"G8˜Í“÷\wû2ÓCw¶åÖé8.Ò–™Š.b·ýö°µ+•¾¨<…ŒÉÇøt‹:õ& ˜B3%¹´­ZÊìå†K§Þ÷ÐûvbOl$•(¼AŠ"© VÀQ8DWþŸçáñyx\‡gy×›!.)æle×I²ÔéqèýñŠ‹Á|ªQ4ò®® ÚógE·F£¿å]#Û¡¶í=ºô~½Ž­|}1’ò`1Iõß$VÌ ;4 òy¦¦tÐÓ‚ø·7}ù€ðã(ïÇy’‡ýA@‰ÿðH—Ž®zv†>z‚Ïj¸1Ÿüµ Pª|Jžç[•µm!–Í*Âé4vôÛÎl¾¢½ýñ6NûÑ`Ý‚þhgÉcÕ3ÑChgK†Ù´ÁN²‹)íHò= tš¤·K¡óQ¦»œÓþj/¡ÓvèÌA/ÖÔ,oZ ¨î,ó†¾rÉ—/|G³ûª¦8ô´X€;ñÀYOˆèj³v¨²õ%¶Vq™†.¨¾‰S­çtv’A y;H½ò÷ÀÝ (¥ˆÕ¯(³±fC%4ëÎ[4QöÇʈjUÚ ¤‚i¿øñ]УöôIrÏ.â›8‹ÓÈáed_3ÁŽÙšA)6À瀡x¥íá(ÎV}8g?Š§Q–Lòdœ: ¬‘x^n¼"Ó²ú ó“Y•Äsóq4Åi>¨S;ÝPìÅb´Æ™.~ãt±Ëgîbã6öo®è²¦k›b¯a²«®jãØQ¸²׺ضíȱGDµ*VÞ€š¤I^E¥Jv|!hg+lk"2Ó]ÿ•L·ÌÍì97çO“xÚ"-M¾|hÛV’Óí"4;D膯ÿ+ÁÒ¼–Eÿƒc1¡ -endstream -endobj -298 0 obj << -/Type /Page -/Contents 299 0 R -/Resources 297 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 272 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R ] ->> endobj -272 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 655.011 283.397 665.915] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.18) >> ->> endobj -276 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 643.056 276.403 653.96] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.19) >> ->> endobj -277 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 631.101 280.368 642.005] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.20) >> ->> endobj -278 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 619.146 254.415 630.05] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.21) >> ->> endobj -279 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 607.191 209.196 618.095] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.22) >> ->> endobj -280 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 595.235 250.55 606.139] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.23) >> ->> endobj -281 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 583.28 212.364 594.184] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.24) >> ->> endobj -282 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 571.325 254.266 582.229] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.25) >> ->> endobj -283 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 559.37 273.435 570.274] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.26) >> ->> endobj -284 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 547.415 278.416 558.319] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.27) >> ->> endobj -285 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 535.46 276.951 546.364] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.28) >> ->> endobj -286 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 523.504 271.422 534.408] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.29) >> ->> endobj -287 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 511.549 229.399 522.453] -/Subtype /Link -/A << /S /GoTo /D (section.5.2) >> ->> endobj -288 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 499.594 225.463 510.498] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.2.1) >> ->> endobj -289 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 489.696 242.081 498.543] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.2.2) >> ->> endobj -290 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 475.684 233.793 486.588] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.1) >> ->> endobj -291 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 463.729 252.961 474.633] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.2) >> ->> endobj -292 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 451.773 256.478 462.677] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.3) >> ->> endobj -293 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 439.818 252.064 450.722] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.4) >> ->> endobj -294 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 427.863 250.949 438.767] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.5) >> ->> endobj -295 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 415.908 200.218 426.812] -/Subtype /Link -/A << /S /GoTo /D (section.5.3) >> ->> endobj -296 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 403.953 225.463 414.857] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.3.1) >> ->> endobj -297 0 obj << -/Font << /F46 237 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -304 0 obj << -/Length 2318 -/Filter /FlateDecode ->> -stream -xÚ­XÝsܶ×_ÁGÞÔGüÉvò $’êŒgìHšN;všÁ‘8cy%y–Õ¿>»Ø<1‰œö‰Äbì绽/ôn.Bû ÂXÄ™q& _™æ¹ðz˜þ©Û›‹oï/^_§¹'² iâÝo½$‰ƒ8Ï=™¦A"Sï¾ò>øßýýòýýÕíje¹/V?Ýÿà­eiê­a­Œâ»»_%¡ÿîör‡þÍñ¿}óííåí* ýáÊ‹«û‹ÿ\:ô„—EžŒQ²Ü+÷~ -½ -è? °Eî=®½—Ⱦwwñ££q”â/~¬&…'’ Nd„šÀÖi‘€p '±Z‹0 ýËMwA¸(÷ïwõ@ßwåq¯ÛÑÈhy}d^2’¸eèFAKÚ‘ÇQáWv1ôPöõFóä¸Óô3tÛñq%B_õL9ôÝC¯öûº} BÝŽz%ü~kØJfSmE?ÝA÷j¬»–‡[únm‰ÔÁnrvpSozÕ?­dê«ušdþ>[€>õ„0^5êd›L:êEYFÒ#ù¡ïŽ]Ñ`óD³æP$8B™awl+bAùT·U½ŠRÿs]UCs;­*ÝÓüÇ0ŒÍëÇâó+­¶ô³óˆ ,;vãÓA qœþÝq³^Òr˜,AˆÖmÙ+MgGxJº^Ü|8q7ážL‡a‚¤nÄDÑ̤`^oa_š;¢‘b@§·ô×ëF«AÓüç•H}XEÇ#ßöláÜíqù—Ä1hTfÔ¨H,üÝBX5V”é é—ªiŒƒ#khàx1Ú|ŒRIt3lêÎsûÞ]¯Ø¢—e ÛÛFÊ[–Ñ >†ièî¤7w—ë·@ìö“j†ŽÿVQ¶¹TݨM£Ï|Qví¨jë_ÅÇj4Þ—Q·•f¾AôcÌèxfxs6 t\Q[¬‰kÞ}ÆhÎ!ÆáHá?¾^¦`1‘=7x67¸™?™fÏL Ó'›œš›·wL ï(ÜpßîØ—,Ã?@zq -7ÌÞf ËB¥*éÍYþáˆ]¤®^ÙÛ*’0?êb`0=œmÿ+…%±©Ÿ½•ö%aÃüÜÊ"£­Šæ˜8UÃNÝTi—ã7.¯Å*.~çïJ¬ô¥yÈËý¶3ØuzÌí#`î«M‡Ž´å›ûlù -{;‡u(wPÐ5ørþ;Žu«§·Îé,úÑ-h<=UŽPø•|b É’ÝìM27ï2ü -Çš–Ðh¸N“ÔÛjñÕŒfŸzi£¤€}”…ùiKš±0¿Ñ“ÉÙk0¹á‹Ìiû±P†‹v×kUÙG?¿ukhXé¼RØ-~K²Ý21–ÊÞIÜÂZÓØkÅ΢etÞ+ìc‘p à_U›tÛ>™×g $/ ÔDä¥à†Tﱋ±ŒÑȯµÕX™܆ãÿ†×Ný¢®æç(ú4úÔ)4DÚÕ;PFÌ–kÐK/C6æ„}’ Ò‚œÔ›IC=§ Lt耧ÉáʾöÑ èépŠÅóÀ™eôTK˜ƒ®'÷öÖ«h¼`V–ÚïÕýůC½„ -endstream -endobj -303 0 obj << -/Type /Page -/Contents 304 0 R -/Resources 302 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 300 0 R ] ->> endobj -300 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.401 286.23 248.649 297.188] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -305 0 obj << -/D [303 0 R /XYZ 72 686.127 null] ->> endobj -6 0 obj << -/D [303 0 R /XYZ 72 668.127 null] ->> endobj -307 0 obj << -/D [303 0 R /XYZ 74.491 618.224 null] ->> endobj -308 0 obj << -/D [303 0 R /XYZ 74.491 618.224 null] ->> endobj -10 0 obj << -/D [303 0 R /XYZ 72 618.224 null] ->> endobj -310 0 obj << -/D [303 0 R /XYZ 485.963 513.196 null] ->> endobj -14 0 obj << -/D [303 0 R /XYZ 72 495.348 null] ->> endobj -311 0 obj << -/D [303 0 R /XYZ 84.453 398.147 null] ->> endobj -18 0 obj << -/D [303 0 R /XYZ 72 382.356 null] ->> endobj -319 0 obj << -/D [303 0 R /XYZ 482.188 135.988 null] ->> endobj -302 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F13 312 0 R /F11 313 0 R /F7 314 0 R /F8 315 0 R /F10 316 0 R /F1 317 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -324 0 obj << -/Length 1196 -/Filter /FlateDecode ->> -stream -xÚ¥VÛnÜ6}߯Уˆh’’(ÉElÀq6MêÝ¢.â ÐJ\¯]6$åËßwx³¥íÚEÑAÃË gÎœw.á˜ÄY€Qœ±„ÁŸ¥yN˯,]_.Î׋“÷0U ‚Q¬·AF–(#I°®ƒ/!AÉ2¢)WORñÎÊ×üû؈%ÉCÞñ^Éå×õ‡þ_ž ‹&˜0çҙ͋õâû‚€ˆb]LQAó ê_¾â †ùÚj‘fWörø·ÁjñÛÄ5šjQÿ\ðiÅ £>ú4CI‘M¢'O§¹ ÿHè€e6ÁÍP3k쪯›%MÃû¦ËvÅ1 ·c_©fè¥Ò°+Ÿìü®\RÞ/Ir»t¯UKÑ £´[ÄØGªéܲ˜údÖåXí¬T:ëjÇíD×ôM7vÞ°>DHð®[»°Z]LõIXsY‰fÃk»Þô.x]#è\Bà„ "M}àR‰ÑÄé¸ÄÕ”HG-§^òž —Þ?RÏ”‚[¡m Aµ•7¼4\K–‚0|Àrí`†u^ójèÀhí üTŠZÃòPZ–Ÿ¾•fÂPç륅+›[JÓƒ€¢hÄ;–¨SÙ™=KN -kSJï‚ÇÊ$M W½âí-M™Þð¡íÅPq)a‡ÚÕb‰‡­Ú5ŠWjÍÕØ@p›×"¹:‹)B þ±ãÚY -L±¬ÕLm–$lËMËíÊÖ¸BL£M£Ü¤gÿ0‚ÙégD@öˆ€8¸C," LcƒáMÑÊî/Çœ³(6½&ÈQ -G\W±S”þ‘ —Òã$‹h‚ -œÍ‰±¶Ê³êx3=u¦²#|uF>Ü'žö=„’4‘Úf#Jñd£äË,±ÉÐ2ï ²MèQÙ;á÷¾y´’T0© Þ¬ÕBU¶mÓß¹$)ñ«7o¹c›÷·ÀK?ë*Ê'!ÆYŒË|ÿß)µ?=9|+÷¼’(29Šü®Yšàøñq;Œà> âî„·Û“Çœý–›&°íë-z«)ƒ[ÇÞKkÆ„Ö†Óï u˜>sYï™´QywUóªEºVðá%`‚òçΚæ$³³>÷ ¥¸oƒox®—(@@'äÉ7ÅþÛZçìK_(…r¿oAÃàf¼9 ÚùØ´µI¯Þý‹§“¼÷λã¼þKù¼'¤ëgR [.\‹œÝMÆ]wq´¼”N¼'ˆ"lŽõâye·o¹‡µwȬ—À$]ù¢0Qb±Sbp¡rãLÉa·³Û¡õ×]k´®]Ó÷ŒSuv¸•>Z]ÝؾÊÏ’»alâÆYÛB¹ ³† FE£öd·tÐ* Ü)Ñsx“º‰À/àAÙ;L?­ÐÁ›núp2¯¦IŸƒâ*˜Á¼ ¹µøë øÜÂ+wgŽ2¬»nOCju?ëä:B÷ÚŽ»}îŸoÄvÊÆRʱói%ϭ𣿃7œþ\¹<)¿³éýËBƒùÜÛ¹€þ™ªÜQ·Ó;¸$zó] -dF ´ÿñ]ú7Š´ -+ -endstream -endobj -323 0 obj << -/Type /Page -/Contents 324 0 R -/Resources 322 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 301 0 R 321 0 R 326 0 R ] ->> endobj -301 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 614.453 189.219 625.357] -/Subtype /Link -/A << /S /GoTo /D (requires) >> ->> endobj -321 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [444.171 496.134 540.996 507.038] -/Subtype/Link/A<> ->> endobj -326 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [71.004 484.802 336.01 495.083] -/Subtype/Link/A<> ->> endobj -325 0 obj << -/D [323 0 R /XYZ 72 686.127 null] ->> endobj -22 0 obj << -/D [323 0 R /XYZ 72 668.127 null] ->> endobj -322 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -359 0 obj << -/Length 570 -/Filter /FlateDecode ->> -stream -xÚ…TK“š@¾ó+æÆ™af€Ãâ–îjÕšDÙä°µÔ©âa1æקqÐ8Ö®áÒúëþúmAO9KL<êùˆ`Ï—\‚”"(ªàõ'¯æOÖ0²c êcFGÑqîa/s)P” 7ûñùË·h4w\æ6sÞ£)r©„!Añ±d\Ž_gÑäëLGþÍcöú2»[£ÈúeQ NE>CÒëÈh•[oï%àŸv|ÃNQ9â2™¡…õýªi&:µçfBD9ö¸d]3Z„è1Ma긔b÷ŪQeÜu8±ÓÊ¡Ô®/ÎÙ>_ö¾ésÕÁ˜û(Ä¡d²«A´‡COê“"Qv«’}œA&Aìu_¬Öf\¥ZÙèH‡ -;-´KUÏʼnE<¨f«µfÛçX—U7ZÏs·mÝ|ÚP£‡¢ß¢{ŽÒòA‹È ±C‰]jd¿µ‘¨júê -Z[Å*67vU¹J뺬úþÌ®{ê]…¸ÏTî•«?iréÁÂÆƘ¯Æ\»opV{iLÂN ÑòA‹Yº³4Lãz{<ùÆe•ÖÍàeŸ5j©Š¸:ƒ’f>jäû È<…Ý}<Ú‚ˆE\$Çe¥’Í]g€&íQ+Ãÿ¹|ŽëCše÷¤§²6­ò²h:ÌÍY»Æ Í j[ã‚ÌErÁw²;Ø; ë´Rç/é_®›ÿã_ügþ °BS -endstream -endobj -358 0 obj << -/Type /Page -/Contents 359 0 R -/Resources 357 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R ->> endobj -360 0 obj << -/D [358 0 R /XYZ 72 686.127 null] ->> endobj -26 0 obj << -/D [358 0 R /XYZ 72 668.127 null] ->> endobj -361 0 obj << -/D [358 0 R /XYZ 74.491 618.224 null] ->> endobj -362 0 obj << -/D [358 0 R /XYZ 76.981 618.224 null] ->> endobj -30 0 obj << -/D [358 0 R /XYZ 72 618.224 null] ->> endobj -363 0 obj << -/D [358 0 R /XYZ 196.601 431.811 null] ->> endobj -34 0 obj << -/D [358 0 R /XYZ 72 416.02 null] ->> endobj -357 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -367 0 obj << -/Length 1462 -/Filter /FlateDecode ->> -stream -xÚµ™MoÛF†ïú W~ýz÷‘Ï'ÛM¦õÕÇÛÝÓæÃöÝB‘Ýû ‹.Úµ«öËvõ÷ÊðOìÌA¶‡L©»¾[½ÿ€Ý _×?.§îŸý]w ‰·Ý«ßVX•q_Ÿ;ãÀº@/•ðB6T‚ߺ*%.…ë+±1fý4\âðÄò+H=†.X1¿„á­{ñ•h‹áÉj ¿AŒuZþÒ¸ŠÇ/íUjo3$43Ò×5§9¥ù57ÈZEúCxÿáï ^y…Åò´(¥ù†±1‚¡ÜˆKBˆ&ŒoÍŒ¬_êE -€JMÇõK“…½3}òÏ’òü­<Ënå› #mÍLZ¾Ô‹ø”šŽ{g& {gúä5ž/å¸À@Þ™VòßÑKÛ3Ó©E -€JM aÿLŸ¼Äá vh¬3@¡•œƒä¥ÌixÔ<…¤Ž0¹Ñç®ép8†ãÊ`±•},AÊ^ZÃœÆG-RàSj }ò‡9\d"°"„ì&ô?cµHP¡i3}¿À@è÷7·áƒ ršÒÿŒR«•¢BÂÄGŸ¼&Äá}¥ç¢lÁ¹F¢í„h^äy@¥¦°­Ï]ñéÃÉÍw%.5r%Ý„.h Z¥¨5º©“ׄ8œÒd½Ô z†AÛk=õŒÿì Ä8 -endstream -endobj -366 0 obj << -/Type /Page -/Contents 367 0 R -/Resources 365 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R ] ->> endobj -328 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 615.236 146.739 629.184] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -329 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 603.281 147.855 617.229] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) >> ->> endobj -330 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 591.326 148.752 605.274] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -331 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 579.371 167.212 593.318] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -332 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 567.416 169.225 581.363] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -333 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 555.46 172.194 569.408] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -334 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 543.505 172.194 557.453] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -335 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 531.55 179.188 545.498] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -336 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 519.595 174.206 533.543] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -337 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 507.64 172.194 521.587] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -338 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 495.685 172.194 509.632] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -339 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 483.729 172.194 497.677] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -340 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 471.774 134.714 485.722] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -341 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 459.819 160.149 473.767] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -342 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 447.864 142.993 461.812] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -343 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 435.909 129.584 449.856] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) >> ->> endobj -344 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 423.954 165.678 437.901] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aa486278c409735df8001096ac2b487dd) >> ->> endobj -345 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 411.998 152.268 425.946] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) >> ->> endobj -346 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 400.043 172.742 413.991] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) >> ->> endobj -347 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 388.088 150.057 402.036] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) >> ->> endobj -348 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 376.133 174.206 390.081] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -349 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 364.178 174.206 378.125] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -350 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 352.223 174.206 366.17] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -351 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 340.267 174.206 354.215] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -352 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 328.312 174.206 342.26] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -353 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 316.357 179.188 330.305] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -354 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 304.402 179.188 318.35] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -355 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 292.447 179.188 306.394] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -356 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 280.492 179.188 294.439] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -368 0 obj << -/D [366 0 R /XYZ 72 686.127 null] ->> endobj -365 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -433 0 obj << -/Length 621 -/Filter /FlateDecode ->> -stream -xÚí–[o›0€ßù~iq}9¾=víRiÙØ4)­Ph-%[`í~þ Œ´IÛ)tQ”&<Çs|üÁG#‚ÎRGL8å -Ì•i£ZS4·—Ÿ¹Ô?sÞ†ÎѩЈ*̨^#Ž¹ÖH -A -Æhàž¼;þú}¯Ã”v¹wž£#BQÇ.– ªÄn/û÷ÓIØýЫ~X úþ…Gíµnßï÷ ¸‘ã‡ÎO‡Ú&¢H1$y±QF7ÎàŠ ØΟ{7Ý•Y7¤¶qŠçâþ±¸OÑv9¨›… 6’É¢G E’¬l,wžŒ¢$Íâ$Š‡ù0ʲ¤Ü]}[4è0AÜK"È$ͽòÇ4IßT£ÅÔ÷Õ‰ùÌc½ËþÎÿJ³É8Mâê×èÛp^T9:¥ð`{Œ6Ü‚ªvvI¯²–š°9šÕ9ãëüë´Q-°Rêagê#^çgÓ¤Š2¸dÕ¨ˆ¥0IÇö¨é2‚P†5hûÈ1Líú2;|ÀË™Ÿr n£Á‚B}j»õ¨°ðó(žåÑù,Ž†#îíï—࿽Ÿ[4L„^ƒ4ýOÒëBX> endobj -398 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 597.638 156.263 608.542] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -400 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 565.977 170.321 576.881] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -402 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 534.316 175.302 545.22] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -404 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 502.655 168.308 513.559] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -406 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 470.994 170.321 481.898] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -408 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 439.332 175.302 450.236] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -410 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 407.671 168.308 418.575] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -412 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 376.01 170.321 386.914] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -414 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 344.349 175.302 355.253] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -416 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 312.688 168.308 323.592] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -418 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 281.027 170.321 291.931] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -420 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 249.366 175.302 260.27] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -422 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 217.705 168.308 228.608] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -424 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 186.043 170.321 196.947] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -426 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 154.382 175.302 165.286] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -428 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 122.721 168.308 133.625] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -434 0 obj << -/D [432 0 R /XYZ 72 686.127 null] ->> endobj -38 0 obj << -/D [432 0 R /XYZ 72 668.127 null] ->> endobj -327 0 obj << -/D [432 0 R /XYZ 74.491 618.224 null] ->> endobj -435 0 obj << -/D [432 0 R /XYZ 72 607.546 null] ->> endobj -436 0 obj << -/D [432 0 R /XYZ 72 575.885 null] ->> endobj -437 0 obj << -/D [432 0 R /XYZ 72 544.224 null] ->> endobj -438 0 obj << -/D [432 0 R /XYZ 72 512.562 null] ->> endobj -439 0 obj << -/D [432 0 R /XYZ 72 480.901 null] ->> endobj -440 0 obj << -/D [432 0 R /XYZ 72 449.24 null] ->> endobj -441 0 obj << -/D [432 0 R /XYZ 72 417.579 null] ->> endobj -442 0 obj << -/D [432 0 R /XYZ 72 385.918 null] ->> endobj -443 0 obj << -/D [432 0 R /XYZ 72 354.257 null] ->> endobj -444 0 obj << -/D [432 0 R /XYZ 72 322.596 null] ->> endobj -445 0 obj << -/D [432 0 R /XYZ 72 290.934 null] ->> endobj -446 0 obj << -/D [432 0 R /XYZ 72 259.273 null] ->> endobj -447 0 obj << -/D [432 0 R /XYZ 72 227.612 null] ->> endobj -448 0 obj << -/D [432 0 R /XYZ 72 195.951 null] ->> endobj -449 0 obj << -/D [432 0 R /XYZ 72 164.29 null] ->> endobj -450 0 obj << -/D [432 0 R /XYZ 72 132.629 null] ->> endobj -431 0 obj << -/Font << /F58 306 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -461 0 obj << -/Length 489 -/Filter /FlateDecode ->> -stream -xÚí–MoÚ@†ïþs)Lf¿w©”DʭŪ*‘¥ØP$>ìÐþüŽí‚ë&RN9ízýîÎëyvÖK0‚눔P•³Úrk÷VüzÇ«/<ë¨ÙŸâèüŠ‡+-Äc0Ê ‰ÖtBCœÀ c»wñÍ6Ôe=F‚»œd©Á =ŒæÑàŽ áñ›"Xðð³TÍA[Ïí úÑçÚñ¶-Ö)|–­+÷—+§Q앱•©Éx¸î -ÓIGù0YæÇÕ2Þw%uÖ¿~aГ†:·dhºÈ»åÃ,]œU½íк{ZdÓÉ"Mª§ÑûU±àùç£ö$E@rœÖÊÎ-‘ªT çƒÍdœŸem‚pj]3ÆŽ8EOmtÙjÔ&g׆pÀ‡È&I³œó)šyî)ïXÞÏ.µ_¿5dÏy—zm·¼é”ÚÏWž°ÔHÆŸ°?°|;àVûtÞ ‘È=Ã+ÛñÕ¯ðͲô4µËÕê´uåǾj¢í÷/5Š£‹wþ4{ù|Ð× «8¶mÍñOŒuáj9M^XY+ôdÚœ‰5¸W–U-Éw&µå_¡>ò¨Õ/ÓjW…’¨µú_¤Zm÷%%÷’Ò¨´Ü[Zÿ^«ñEM·¼Výysì -endstream -endobj -460 0 obj << -/Type /Page -/Contents 461 0 R -/Resources 459 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 430 0 R 452 0 R 454 0 R 456 0 R 458 0 R ] ->> endobj -430 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 655.203 165.34 666.107] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -452 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 623.323 170.321 634.227] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -454 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 591.442 163.327 602.346] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -456 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 559.562 144.866 570.466] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -458 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 527.681 142.854 538.585] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -462 0 obj << -/D [460 0 R /XYZ 72 686.127 null] ->> endobj -463 0 obj << -/D [460 0 R /XYZ 72 665.111 null] ->> endobj -464 0 obj << -/D [460 0 R /XYZ 72 633.23 null] ->> endobj -465 0 obj << -/D [460 0 R /XYZ 72 601.35 null] ->> endobj -466 0 obj << -/D [460 0 R /XYZ 72 569.469 null] ->> endobj -467 0 obj << -/D [460 0 R /XYZ 72 537.589 null] ->> endobj -459 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -476 0 obj << -/Length 583 -/Filter /FlateDecode ->> -stream -xÚÅU]oÓ0}ϯ¸ÉC]Çæ XÓušŒ> u£ê§‹H“’¤Lû÷Øu¢RA+*1ñt®íûq|®o‚a ¦aFX ±XriQ -¥4öøÄÑÝ4x7ƉP@bD‰à0Ïs†˜R …@\ -˜g°ß_¿ý8ŸÜE#«Gó HÙÀ‘””{¯dv;ñ.³W“/Î-˜Ìƒï±1ˆ)Hæh(H7ÁâCf÷o3­àyïµ.•Å>Ÿ~¹Ît0ÐÖ@8b\RGÛ¦š[.ÔsáˆD#‚1“¢4–UámÑv{RCÖqÂcÐHK*] –<ÒLúצq‡Eëqå¡työV÷eé¬NwSu&óë{Œiiúðç¢{òÖcS˜>43mÚÛ®¨«öÍ»:í\#÷†m›»8‰Ù±ú¦Yµ»Æ,Ó:3èé(°¸ïAZô=Y–MË>íïÙÕó]•î ùe»Ûnë¦+ªµ_÷•ü•뷫ƒ½ª²áz~Sk¢h$lCþ5p­Oy~“o1" -óPû¤ì£?é¸Î—?""B“vËÍ®<+½¼Tú¼n¼1”Ö÷XàDzN¿Yƒø-[¼+¶e‘®\‚þåö8M\uÔÆ a ‘Ž™ržrÜ×€!Izz_½ÛÑl¤¤´¼”¯,_¯±gàtcf!w–j{5,Ž[Û½lMû7³teÜ Wà·}ÿ«&Æ>æ~ŸÐjFÔÐì5áÌ ^Ü?Òó“iÿ)?c˜Œµ -endstream -endobj -475 0 obj << -/Type /Page -/Contents 476 0 R -/Resources 474 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R ] ->> endobj -468 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 546.885 147.194 556.813] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h) >> ->> endobj -469 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [534.022 536.011 540.996 544.858] -/Subtype /Link -/A << /S /GoTo /D (section.5.1) >> ->> endobj -470 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 521.998 144.853 532.902] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h) >> ->> endobj -471 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [529.041 512.101 540.996 520.947] -/Subtype /Link -/A << /S /GoTo /D (section.5.2) >> ->> endobj -472 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 498.088 115.672 508.992] -/Subtype /Link -/A << /S /GoTo /D (types_8h) >> ->> endobj -473 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [529.041 488.19 540.996 497.037] -/Subtype /Link -/A << /S /GoTo /D (section.5.3) >> ->> endobj -477 0 obj << -/D [475 0 R /XYZ 72 686.127 null] ->> endobj -42 0 obj << -/D [475 0 R /XYZ 72 668.127 null] ->> endobj -46 0 obj << -/D [475 0 R /XYZ 72 618.224 null] ->> endobj -474 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -495 0 obj << -/Length 1402 -/Filter /FlateDecode ->> -stream -xÚí™KsÛ6ÇïúœôBÎTÞcšÚi2MÒºê)I5´DÙ+¤JRr§Ÿ¾ ”(ÉtH¹Í«¹„ÔⱋÅ.\8x6ÂÍaF˜ -0bJr O)´&AÍMÏF?LFÏ…ˆB”Lç 1­)âR“yð&|úÓ“_&gј*ŠèÝäE06Úy0†±’r×ïüùÏg®Ó¯ŸþþòìÕ$"‡Oê'Ï_¿²CGg“ÑŸ#a《’ÙÐt0{?zós°¿°ÑÜÖ½Þ\jx.ƒßF¿¶–L…}µf)& 1.©] -L- ‡è¨‹N  Æ8LŠ¸\Éq4„K„Á—§)¹7$Ä0ßu‡{"ì²b˜åó‚!º†DQž§ËĽ]$‹HAhI6s‘5 }|ÎU`‘TÚyÇJ×óBž‘aÒÍû<«’bÆ3;ŸÀa•»çbͪ4ÏJ÷³\¯VyQ¥Ù•ûÝä¢þá«ÍÙî=ÎæîežX#²ÑAPºÞá»4›-×v¼„t?ºZL7ɬš¾_/Ñõ#·¸½Ýs¹#ÈAýtŒ#¢•çj»„v^:òC$âLCz(’ Ào){cƒ7c‘m"3Oç¾Í"`OLýrQ÷ªs1›¦YZM«ør™”‡óØo±ÀiV¹,Ý|ïž[C‘GT„·¥·¯³2½ÊŸÓÙu\¸„ÞZÅ -ilÀ‰[Æ̧½½VŽŒ&MŸxÈüR!Õé¯Õ岄•’Ž]P,Ð0TÖ:2¦òxŽáHÎLÓ*—éß £.£ŽÓ¼ð/qéwVDD„–ψÁÑpƧ}µãн§ÈâÁá -Ôчb -k1qMçqOË29œ‹îP‰Hhá°¿—Iûƨq¼Ø‰n -€¬}·Áv‚.€†$†ïðNX— Â[ËG‡Ÿú­égÓ3ĢIŽ8¬eì$b˜7Ø»¾Ürø’}hŸ%Yâ@¬[OÏójº*òù]µ¥-õ¶Ú”±pkÚìl­¢º(†Ë¡9©¢èíBÃ-Mñ¡2í îíDq„ò½î˜cŒ¸`ìžÛÝ Þ 2J¹ ‹A®÷뾸^{³Âu\8~»^ºÈó8«¶G!÷Õ³WãùzVÝ)‡»À¿'½”¨»!íÐÍ_G Âmx* öPÒT0mv¶ÖCC'¨aÊNCµ¯Í‘æê4½ííD1uýŸ¢j(ù2Q}x ÌîG••Ä0`W³†U®y¸5mv¶VaʺY•úôê·¯(?4“§Éjo'PH$Íqið¡³7Yƒˆ¡ÿWi¥ÔòJ{´]­®ê¦ ;]U{NÚ­«Àªæ'±ÚÛ èª1äÄ ¯ÐUCèàëà0m5HØ2€J¤ù Xu†Û´ºö~»õ#Î×Õj]•Ÿ@{iï:á›öž¤½ãZö•0ý`}æ˜ÜÏôqA["m‡{€¹ÿïkj fí+ºxÏ_~§AÝ׉Áh¿,í_ûööL+Ä¿1ýIuÚ×ì[Íñ9Ög“Ñ? ËÔm -endstream -endobj -494 0 obj << -/Type /Page -/Contents 495 0 R -/Resources 493 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R ] ->> endobj -481 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 489.057 173.249 499.961] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -482 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.545 461.161 199.314 472.065] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -483 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.601 421.311 183.215 432.215] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -484 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.945 381.46 205.243 392.364] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aa486278c409735df8001096ac2b487dd) >> ->> endobj -485 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.7 341.609 205.532 352.513] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -486 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.583 313.714 207.428 324.618] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -487 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 285.819 214.606 296.723] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -488 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 245.968 210.448 256.872] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -489 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 206.118 214.606 217.022] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -490 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 166.267 219.232 177.171] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -491 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 126.416 210.448 137.32] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -496 0 obj << -/D [494 0 R /XYZ 72 686.127 null] ->> endobj -50 0 obj << -/D [494 0 R /XYZ 72 668.127 null] ->> endobj -478 0 obj << -/D [494 0 R /XYZ 74.491 618.224 null] ->> endobj -54 0 obj << -/D [494 0 R /XYZ 72 618.224 null] ->> endobj -497 0 obj << -/D [494 0 R /XYZ 72 508.03 null] ->> endobj -493 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R /F14 318 0 R /F73 498 0 R /F43 499 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -517 0 obj << -/Length 994 -/Filter /FlateDecode ->> -stream -xÚíšKoÛ8Çïþ> endobj -492 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 642.06 214.606 652.964] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -500 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 602.209 219.232 613.113] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -501 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 562.359 210.448 573.263] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -502 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 522.508 214.606 533.412] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -503 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 482.658 219.232 493.562] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -504 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 442.807 210.448 453.711] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -505 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 402.957 214.606 413.86] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -506 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 363.106 219.232 374.01] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -507 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 323.255 210.448 334.159] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -508 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 283.405 214.606 294.309] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -509 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 243.554 219.232 254.458] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -510 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.378 203.704 210.74 214.608] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) >> ->> endobj -511 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 175.808 188.592 186.712] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) >> ->> endobj -512 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.012 147.913 184.786 158.817] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac73ea8358bc3155c7f3a6c078a7d6d35) >> ->> endobj -513 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.012 120.018 181.618 130.921] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a484460566a8c888fda3d769324461345) >> ->> endobj -518 0 obj << -/D [516 0 R /XYZ 72 686.127 null] ->> endobj -515 0 obj << -/Font << /F46 237 0 R /F73 498 0 R /F43 499 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -527 0 obj << -/Length 2526 -/Filter /FlateDecode ->> -stream -xÚÍZK“Û6¾Ï¯à‘ªŠ<<ÚY{jSNUÖžÝ=8ÉEA3,S¤ÂG&“_¿ÝHJIÞÚ=~£ûkH4xhp{C L$%"‰£ž±TŠ |>òéãíÍÛ»›ïßÃTJÒ˜ÇÁÝ&Hx«”$, -îÖÁçP¶XrICÝdmß,˜ -õ}^¯5y´óï‹RÛÑG½ÑvA•ëůw?ÞЫ„ >/‹¥ õ¨½»»ùý†ÁÌÊ+IÊUoo>ÿJƒ5ÌÿˆôR<™UÛ Š<ËàÓÍ?öB<-(°E¡-c„ª",vöøTTƒÂºÔ[]uöåöý/TRŽ’‚IE2%‰5iD8• Š¦–Èov•ÇL’(Iƒåd•‚ÎøEµˆhøš—†­^0Ï&À2™xqÉ('ÆKÆI*™%ø çÒÛ–è.8 ëbí¾¡YÑ3f`ý€2uŽFq(`êTa Ên‹¿ôúP^Põ´Æ´zÚ,"e‹ÏQ~|AñZ/¦2|ç4Ày£¬vŒÉcB¡ÒMý€a"ˆ!`„BÓs™¡8„L̤2ž‡$x=ÁW9x`$Þfƒ8«gË8Ïʼ/3ë!ü`lh„¯;;Ø5õºÏ;_ \†[òX¥¾áÚçíª.MZä&¡¬ž;í^íá'TN!ðÕ… -˜ˆƒç›ºu<3ûhug6“óp…E±ß,¸ ›šÅÂà‰]&ÿÖ}þ‡ (þk0ÌÊ~ÐÕå}î"sv¯ãep_kÝm¹ÑØ7° Š[óÆVSt§ÉïqØ=ï´22ÂÌä %áxŽdøÏÖÅĨ,…Yi·§ãìètœÝêÌhd™¹Y…µäÙ®hõï½õž³ÊÂ÷mæX9ù]¥„™¢ÊËÞTÈ™ó¸?}’ÙÓ‡Cpcf*ÌÖ•j² Ñ‘0µ6̸-fQøS_vÅ®tt]‰lmÎïøÅžìOÄà9œÅ\WVnòáê˜[Ä–±#Úw»¾›ÓÒ -wµ È8¶'žu¥í`—µ&ä¤ -ß‚êvòö½}n­6ÏöÍ3 ÖêþG±v˧‰^óÌ1Y¹ïíN»ýÎ}q$]ÒµqdßxóñöÝýÝ›·Þ}r|;ûòÄ¡'QÇ?wºjµ­¶z[7{µ¦É+Š}Yí¸«vï–®ÚÕyYö¢ÞÍ08Zý ý±ž®Ž ®^r!Àm†¬×‚2Í$8}¨J¢S}(`=•Ž¨é8=I˜P€e¹!'ƒ-méyÉ7NHâ_Ë Xœ2Ÿï:ë2«5&òÅ2Š“‰ž™^€ÔI*Vj@f‘ÏÉ Rœ#`XÐxXóe– #‘RçiLg„ùÔÎQä s<ÂÐ rÍóE΃W¼ˆâ—àÕ$9ä°æaÓ­²”óR¤„îîåR‘LÂÕ¸];+„€bÄÏb) KäAûŠ0{àï:¦—ÒFç{åÀýaG•àÙ‰ü³lúÀ±º´·íïµôÐU¬µköjõWeiý$fÍg†M_¹ÙÊÆ®)Fn“BCÆ™˜=ªÍØf•I`”lx”…ém`d8³­ûÆT_·s ³V6”„§®Îwn‘­%H¡±ÏíX÷;}6ϬíËžIÖZŠP0ò+ðÄÔ‹½ÐcŸ4!yFR˜æïBØk SÐ9¡Ì¯<³( JYøïG´²÷à^0Óëá£í‹.[¤ë 0ÄiØÂÛ ˜èL÷‚K )sƒ°$‡‘-M8ÿT”¥%¶ƒÎ¥n¶vÚ¢q˜µÍLë:_Ž»Ñ‰8o×ByœÝÌ•ÞZ¯—Ÿê²Þ!ìÐãl°û‘éH¸f /6öõÕœ‡]Ý×' McÜvM?Y -¶ÎÅÀOWhZw%à@8., 7,úë‡É­èÆ Ÿ&¯/÷KJÒ4†<];SV㟱ÊgM¶E èûÙ{„yú‡_/¨±Å£ý§.¨ñ‹‹±DËý„¥iÀ£˜(0à Ôa®)JH„‡N$¡HKREr¬ö3ÐDWy)S/0™ -Cé]=t~RÖYþ8IÙ/3öb¼þÚ#ðýû°rÌ´^½îšy©¯Œ”ªè…}GÃöøôöÓrÝ~(µ%€–«%â` ¥ ^ܽõ—ãQrÇù(™²¼²IÕoWºñý¼©ß[ßñMéþ©õoÿÆ,åÒô°zzS8ÞÛ„}*fÎVß÷9lG°{qÌ\·ßÆ GG²ëb†+€m`HË#XèÉ°~jÇÎeœçcgÊùdì¸Þþ Ž~%Èë*ï›PBù<ùq@?Ü{ˆ³•ò=Ê™ùIá∸n¿‰–&DEü´ -ÐmÀQ=Јó$à ¬¢¢}U‡ËØÎGÔíϵ¹qÆ+6a ϬiÌ=Wêð.<‹ÊÆ®B°ÓÚñÍ×öuÓà•Ž4gÇ3—i†æ‰ß~R¼’¸/ª¢»· ±¼½è”@Á" ê['ßjöÞf¬‚Å_.þŸéø°áòœ_n¾ÌPñœ 2¶€c:>ztÎ/òqw]Ô®ÜoOŽ’$RW5žhÃñwYêÝæ=7—1=8×7îŒL’çΞ¥ƒl9…]Ã)B(ç_àŸHšç«à»¶su9ôºr¿u}"`ì+]OÁ¡àÑ$& ç‡7,óÞ¿Œï¼÷§|_íýáâá ¶žáý³Uð½HÅå ê‚ýó­äË«YØF)(Q¢ÔØâw}SµG~êöý™Úü9p±pn©ðrèÔ?ª¥$VìÜTýõ¾<ì -endstream -endobj -526 0 obj << -/Type /Page -/Contents 527 0 R -/Resources 525 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 514 0 R 522 0 R 523 0 R 524 0 R ] ->> endobj -514 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 642.06 188.741 652.964] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a81be18ea979e8a32f384e1a7856badcf) >> ->> endobj -522 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 614.164 214.694 625.068] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afd549f435ee28276b5a9408a3a6256b1) >> ->> endobj -523 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 586.269 177.882 597.173] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) >> ->> endobj -524 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 210.231 499.771 222.749] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -528 0 obj << -/D [526 0 R /XYZ 72 686.127 null] ->> endobj -58 0 obj << -/D [526 0 R /XYZ 72 558.334 null] ->> endobj -62 0 obj << -/D [526 0 R /XYZ 72 427.484 null] ->> endobj -320 0 obj << -/D [526 0 R /XYZ 72 403.078 null] ->> endobj -66 0 obj << -/D [526 0 R /XYZ 72 403.078 null] ->> endobj -530 0 obj << -/D [526 0 R /XYZ 72 271.167 null] ->> endobj -384 0 obj << -/D [526 0 R /XYZ 72 113.727 null] ->> endobj -525 0 obj << -/Font << /F46 237 0 R /F73 498 0 R /F43 499 0 R /F47 238 0 R /F14 318 0 R /F59 309 0 R /F13 312 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -539 0 obj << -/Length 2066 -/Filter /FlateDecode ->> -stream -xÚíZ[Û6~Ÿ_¡G¨Þ/-Ð PìÝd€}H»Ç–g„ØÒT’3›ýõ{(R¶hÓÊHšf7@Ÿ$ÓçFž‡‡Ÿ“‡'·7aF˜J0bJr O)´&I__ùêÝíÍOw7oÞÂAFR™ÜmE© R„'w›äC*Y,©ÀiV­êCµ :Í>®ËM†ÝøÛ|—¹·wÙ6sÅ:[ü~÷Ë ž\òaɈ"%$°öóÝÍ7^qB\¼ª“õþæÃï8ÙÀø/ÖžÑÉs+µO¸ÔðÜ%ïoþÑ Š -ûj~%„9[ ¡‘§•@ÑÅ’`ŒÓÏ ÊÓ2ßÀÔÌxÝFDF˜@B¨Ö#áQd´9x -a Xœ XeHCįTHyá¹~FŠ‰ÐïfÕ¬"^5ˆPó*^ A„èÐëýªÎÜZÿ†^,¹i^467oUÁb6 ì·z»¬øÁ …>4Ò’tBqC„"˜»©«Å麎£ IÉFÛdu·‹gŽb‡¢ÎŠÌcl½PéãªrZ°=OZ°N”ñNë7ŒY$…7Ìç…Æit]0Ò˜ÌàJv9[Óh `.âÁdÉ´„"‘, AF'q=6°Äa¾(¶Þ$lŠb "¨?QV&¨¥ª'¼Ô -e’%åíâ·J·Y¥´ñ5³¬Üs“µ›¹Wiý;\{ÙÂ=ïwåúS7¶õú°)p¯¬–„=³Ë oéó‚°]çeÚ…Ä°„ -IêwØm¾ ÂKYO”¥+÷Øå°í[ëžuy¨ÖÖ.¥®´£.05éÃiž T¶QX •{î»&Úe}ÍЇ«o÷áädU;‹õS¶Î!•´¹ÿ½_5UþïÐäí[[<¨G K$¤‡é¶h†4dv2ñú— 2* j(@àIJw H–\À¹ ›'f™míºÚH×yV45‚âeHúÏG»ÊŒô!\xF°ƒ}Ô‡¼YÝÛE²ruÖ¸a;;piÖžÁ@ó˜×Nt{(ÖM^zOÏùnçÆŸ²j[V{7Ükl+Ú;öÏ¿=ï.‡RDÕ`w¡”´×ÔGĘD°©C6@Ú¡®wª‚F¿‡[[p> -aŽ§cä(àULuì"Âð8ý[V<4aýÊVëÇ^u»,nîÍn_·QÖMYµ[/<Ö¥ ´¶ÕËÛA—óœ!Upü„ÃDƒºVÊ<}8i$œ›ó€N ÄÍÅòxT3íÏu´LóGKßóÝ£ÏgqØßgU˜ïúù¯CT¥-’Ï~4ïêQg×—¹NúxnÀû¶to;£§æÔ9Yê9¶ý®jr¨m25Ø‚sRÐ^¯{6ÓÜÆaÓw;›òÐ<šsy€4e—ób}¨*8Vw_|‘j;’7®WÃèI…Ùu,åt4ÌÓoáÀmë*ÔðàÞcÈu4p -éHfˆÝÝ;®ašÃ8ú-á>Öæß0—Zx®ªjõŽ¶€g^8DX)ÛrÕî½ëb7îã¶*÷î­kÜûyÖÙô}ˆ§å:ÚÇlØï³õǼțΡ=Û.n0Û/2“þýPûøî³ ãòæñÌÿã‘Ïhä:Ät{£¿¸++Éá†~¼¥}ŠX ŒÐNæXƒ¯nšÑ0oµ•˜Þ¥ÍÔw{F $ñü.Í’U\AרMpø^ß;ÓG7OàøG¿Oz¥óÉí§³ZÙﻺd{9{¿?´{c :%süÂô:Ç|zúçé»ôK†(Ÿß{Q»RÂuT†TD<÷Ó¼Æsß÷úâÜw·ô³suDîGO!̨c1=õ£Õ_L „Sœº  ¿7‡ªˆßOϳ•(òaÆœzay”VwðŽL ˜–,¹…ˆêÓ×,B_‹ëô5# “>“³ék -–42L½€½†Fú5ÜZöëÐï{ åç5¼H»9›míÈkq$¯ñš]ùuòZþu¾™e>Eͬ}™#µÝòµ¥m˜Ÿãôµh!aÅ0{LbÝÄ9}}ŠãaÛÜ[ªjÂî71?ŠŸxâ–xþ& ´¼F`¸®Ñ?™ÁöêehpÆ0J_LbèË$ùV$vHM‹¿¨é€š–/¢¦åw@MK6þ€ó OÒoJR‹W ©/.ug?¤ƒ/ªÐǃÿCî~ÑéÏí9£»MúþýÏ‘,9´VFs€ƒh þóirÀ=âzz6S¿íÀ)…×aÉ)±7Mõu–|šÏhûøü%ÉGÏ7Ì2hÃg:Jæé·(!ö@SjL·E1ø’¬Ç“D12Ñc$}—ß7>~úAέºRÓ©™ú3úr:³´Ø?wpXèþ(éj.Òòù:?>Ñq:}ÇÿKz|üœÂ|‚:§Ó¹ž™úzhÂgÑãpY²´QJ‰<]lvh˜ä6†¾Û¿Hòï„$ €ùÒþ±nz6Sßí®aò3 ©#°Ý‚Ó:~ÛLòß6}§ßŽ=ƒ0o ­äô®k¦¾Ë;“Hâ™]…îOØ|ÂÓ°sš#žûi~ãÉïûývüøø)„ÙuŽõôì×ï -shc$5û7íÿwÁp -endstream -endobj -538 0 obj << -/Type /Page -/Contents 539 0 R -/Resources 537 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 534 0 R 535 0 R 536 0 R ] ->> endobj -534 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 500.345 499.771 512.863] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -535 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 260.492 111.003 271.372] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000001) >> ->> endobj -536 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 173.703 499.771 186.221] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -540 0 obj << -/D [538 0 R /XYZ 72 686.127 null] ->> endobj -70 0 obj << -/D [538 0 R /XYZ 72 668.127 null] ->> endobj -541 0 obj << -/D [538 0 R /XYZ 72 561.282 null] ->> endobj -382 0 obj << -/D [538 0 R /XYZ 72 401.032 null] ->> endobj -74 0 obj << -/D [538 0 R /XYZ 72 386.462 null] ->> endobj -542 0 obj << -/D [538 0 R /XYZ 72 234.639 null] ->> endobj -537 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F76 529 0 R /F14 318 0 R /F47 238 0 R /F13 312 0 R /F73 498 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -546 0 obj << -/Length 2219 -/Filter /FlateDecode ->> -stream -xÚÅÛnãÆõÝ_ÁG -¨fç>ÇHÓØhÐéÆlÒ‚¦(›X™tHÊÞí×÷Ì"µ#Ú7퇣9—9÷s(œÜ'8¹¹Â3ÂT‚S’KxJ¡5IZøùÄOïo®þ|{õî¶2”I*“Ûm¢h"u†áÉí&ù -DVk*pZ¶y·oWD§å¿‹fS¢·]íJ·z_nKw .ÊÕ¯·ß_áEÌ%ÖŒH!RB'ؾ»½úíŠÀ'Äñ+PFuR<^}ø'ØÿÞàËtòbO=&\jxî’¯þy`j`Ž -³4/‘%BÆ<‘£,óRy_öû¶î¦—ôO¨Î’5<1£¼nj/  í#Âk¢@,YsŠˆÐƒ>E|µ&ãôyEyÚTP¹éD>„ Ä%I$6×`sB¢(ÓÙ ¦/A˜F\&Œ4ö‚¨êª1üuˆ -Žh6%Úçw+•îÊÎ]û,ðjÍ…n,3ï®Õؤ¹@ŒøãÜ‘)àW¨p$Ž†PÐ gÚÅi³""}éb©@‚ñpz_wÕ}]z=ÀýCÞ:(p´”#á$@ý²‹0¢Æ|ä¯_ç÷#~¿íïV§».&‰¤Ê虸ˑ›¬™Q“VÉšrÄxæ þ -æUå»ê?>Ä€æÚa½mZ¿0,ä]ïÞ¾³qÊŸÿ•_u1¬ózã›ÒF2ÃðdüMRoc7e ¯7ʦiÿPšKK£òOO€ÂÔþäy2¿Öe9ì[þÌæ?³1ëpÂñqV†‹˜]ó»§ÑÔnën×ÃÞÖímò>G«µÂ*eôîs`ªn¸#A™^}þŽ›#–yáƒ{U?í½\‹¦Ü®¨0vA‹ª¬{tâç"™ T šxÕþ`BWÞæeo²IãÑ4Žÿø×ã” ˆãS³)⺠l=_‘,KföÀ œxuŒ¢ŸbcG†Ð¯ Rˆ`/¸±xk2Ä¥§éJ(„a9!yûà=§Þ?Þ•ÞJŒÍ™ç³ñˆ²èƒõt;-‚“†Í¶1¶óÒ³òîðzK §ó¾­>Y%¸@Uߣ/o/8ƒÏ/¸þTçØ¡¹Øf–Á[›áADfËl†j pq¤„ 銋´yéNÚÎ…”£¶3¡VlÝ•S›î†¢–ÑX10û²ŸH‰Cï4Ôë#HÌz’¦çüâ\íNÍ ^Sχ?³ÏçÐéÿ_Ÿ¯Æ}¾ˆôù -ü/Öçs„¡beÒHƒ/ëóÁù¤´¨HæÍ—>CjŽ¹¼FLük• 7¨[&d7MŒ¨âHû“K‰*…4cS¢O­)EšM„r&÷Ç—RÎ2Ä)RÎM#ôüÉ©9Ì5ø‰ˆªÁ½we@ÁòõÉáÌó LàÓ„g±¡‚ze¨@ùëCο*D¹Ð(cj9'81¢ ƒ(:;å)NÈUKñ»ñ±€!¬3ŸC|-½)»>&‚ó EHDµžÎYn®±…<Ä …+Ó7f$a¶±gÿI"„¡’õ蔶|DDãÓvñÔ6›}á_^ªÞú£þfÜ!¸„> endobj -543 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 239.795 111.003 250.674] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000006) >> ->> endobj -547 0 obj << -/D [545 0 R /XYZ 72 686.127 null] ->> endobj -381 0 obj << -/D [545 0 R /XYZ 72 632.899 null] ->> endobj -78 0 obj << -/D [545 0 R /XYZ 72 618.329 null] ->> endobj -548 0 obj << -/D [545 0 R /XYZ 72 527.832 null] ->> endobj -389 0 obj << -/D [545 0 R /XYZ 72 392.29 null] ->> endobj -82 0 obj << -/D [545 0 R /XYZ 72 377.719 null] ->> endobj -549 0 obj << -/D [545 0 R /XYZ 72 213.941 null] ->> endobj -544 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F73 498 0 R /F13 312 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -554 0 obj << -/Length 1723 -/Filter /FlateDecode ->> -stream -xÚíZIoÛF¾ëWðHådöåÐiÚ"uŒ @’45²ؤCRvÓ_ß7 iR¦K2‹OŽæ-|ë7ÏÆÉe‚“ÓF˜¦Œ˜’\ÂS -­IRÃÏ[~:;ý|>{u[Ier¾LM¤6Hžœ/’©@džQS[çͺžÚŠjaÑUØ?Y]Û°:³K”…>;ÃG)—|Ì‘B¤„¸½9Ÿ}™Xâ„}2T'ÅÍìãgœ,`ÿ­ãgtrïOÝ$\jx^'ïg>(Õ+G…[ºG´ˆ0C‹„1O¤ÄȘh•3Û®ë²d|‚AÕ€œh¤°I2xbFyY•Ñ@#Ù‚3¢À,É8EDèÞˆ"9ÏÆ8½›SžV«8€ñôr陎ìCG„‹Db÷l—‘(2ÚôfzlpvÀ -#£%è-Ú ±B#IÙ³ˆ•IBÇbÕ”PÅ‘!äY„*…ÌXä-ĶH«Å„\#ÑóXØÄõ†Ü|NHz÷/ >þ„žgÏéªô&xu¢†ùË!¡´žöÚ–?„Cc9“Ru‡¦Š 1»3w[8Q†6Ý©uÙ¬.Kñ˜«ô*¯Ô“*"zªO`µ ȧݙËe{1'8½n&µ0}¼[4SPÓ›¢©ç§Å¤]AXí©GÆ\‰‘ž #Ä“ô<Œb¶i§lBÐÈ2*VE*“ -PT&ž¸`£QcÈedÓ‘7Tí„A^Fmÿ§FLÒdÙà”özøfqç’ JGU‡w—Ð~q[W‹u_îWml3í½s^ªu{»nä„‚Îið¾+—’ƤùICzþГX<ð‡—ê¶]ݬþó>‚׶ -Ï"¿.Ö×ykãv/Û‘¬è°Î#›<ž[ÝX4Ïæ_+ÛLo7)#.åÍá6øÆNË¢®š¸¶yqV_»Ï«–QÓ+ -]Iˆ¸²«ðÝpPã4¯ëük\–ÎtÊ >v‹ªlÚ¼ŒÇë5•—‡‹Ê.çT¸§ÅÊ–Ýïm¤úÛðU²¨rÇÈ\u]Dd̘ô—¼ Û6P®ïbØYú€Ðž±Â‹Uyé¿Ó° €` )ì?–1)çÐ<’¥'ë²hWUÎÔöËzU;ç»·ÛÚf]0Å#Â+ïÙ…W:Q(Wˆbõ¸BŽ‚º&Ý6ÅÇ­Ø>\\Úc;¼éµÎ÷GroVÿM‘Ê;ÄmôñàvC¸UµìrÖa‰’×…˜À‚6À–k¼?úÅÙé&Ž7R…„V`snñàôI¨»VÝw”×þ¢€vnã ˆ9ä‘@ŠÇôyçZ^ç7¶u ™¤ÓjL ØüusP—µC”õàã9éà–„3P–Ó]<àtðöÿ(6B˜¹ãŦ¦Ç0SøÒaâC…ŽºP¾k„þfËË®õøb#úB4ѼVexºœñ5Bÿ÷ucùÂÆÌ$¨–â¨ý4‘˜€þy‚?^Œ¢ÇÆp :ßþÖGc΢ãèCA×ZEØ·/0…+1(l[Ãè0©Óa4”úÇúæÂÖã0Ú ž¦Z×…mvùuoõÆ~qÀnûõ8zïWfãÝ_w C¶{•ÂÕ—*¸àx’‡kÁu³Õ¯IöêPê» -®LέpAñ˜.J“mœ»þnM”»˜g$ýÚÎ --»î ¿y[CŒâÛ9üÖµü&é½£*ÃVhô°Ñsd‘#íúx`ôÐdzÐú¡óK)ÆØâ'S`_OŽØ3}püGÂ_CµOÛÝ‹iŽ4ܺË(Sp·Üš‡ žÌ‘à×ñ0(l·!-šxa«†å­ë“ýµm‹›÷Vwì) Çôpt$}p5\¥µ:93€9€'f|ÏŸöóaR§ý<”úd?;õVe¼æø¼Í#r“µ¯K Ûåÿ½?cì? —êpsýžSd¸¡|ï!²zCX›1æz–¹±ˆÂÍäenü27~™¿Ì_æÆ£¹ñû÷o8";ÿy’`Ç=ÿyá¬&åt -endstream -endobj -553 0 obj << -/Type /Page -/Contents 554 0 R -/Resources 552 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 550 0 R 551 0 R ] ->> endobj -550 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000007) >> ->> endobj -551 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000005) >> ->> endobj -555 0 obj << -/D [553 0 R /XYZ 72 686.127 null] ->> endobj -393 0 obj << -/D [553 0 R /XYZ 72 632.899 null] ->> endobj -86 0 obj << -/D [553 0 R /XYZ 72 618.329 null] ->> endobj -556 0 obj << -/D [553 0 R /XYZ 72 454.551 null] ->> endobj -374 0 obj << -/D [553 0 R /XYZ 72 306.655 null] ->> endobj -90 0 obj << -/D [553 0 R /XYZ 72 292.085 null] ->> endobj -552 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -560 0 obj << -/Length 1933 -/Filter /FlateDecode ->> -stream -xÚíZYoÛF~ׯà#T›½‡HÚ"u @’4EÛlÒ¡¨¤é¯ïìA‰”)Z$å úÄÕîαsìÎ|6Žn"Ï0ÂŒ0aÄ”ä¾RhM¢–,]œÏ¾¿œ½8ƒ)ƒŒ¤2º¼Ž¤6H].£·±@d¾ ÇY™¬7åœè8û+-–ºõóg«»Ì.²ëÌoÈÓlþþòÕ OR.z»`D -ÞâöÓåìÃŒÀGÄë+¡:Jïgoßãh ó¯,?££On×}Ä¥†ï]ôûì·R[娰Cû ¦i‚0æ‘”¬òzNyœ”É}VÙ#“xÝ>o¯ˆýÕGçÂÙ¿ï< ” l{¦SÒ#bL$9CÌÐÃvd„,œákŽ0°ã¥×:ËÝe¹3UëÐD€T1V(WM¡B! ÖП³ü¦ -ñZ\‡xNÒ0óqNDœ¥UQú߫ܯ>WÙÍ!qüËf]…YÚ/ÎiJ•Q,@='ï;¿¥¥˜BŠëz÷ž‘è±1XQ>Âí(°läø šDîcˆY£È‰1‚w2Ž”¡Þz{ƒhœÔî jJýus••í Úu±)S4‡½:X½¶[˜½&¸u½÷+–HÕÊ!‡ÝJá]¡*’”"ÎŒ7ðÍuuu·>ìØQb»ýÚûºXåö‡<§qUØ/‹iHrÞ æ6…ë ~‡1ëÈrŽŒ&õÖÅÅŽØ..ÚrWó‰?Wsg^ˤ,“Ï~ÍF¤z(³EšÜ¥›»¤Ê–~--òu•äÕÚo¹JÖõJ‘û©ê6ó[Ž,p¤p>lªšQv=§ÂªMVïh!’RD ²áºMWëK‚¡®lÇ0PK£ÇçÀ4z—Âp§™ü>ÚÂDó¦[—s¦âô`Œ”Û™M¹/½ß›wۃϋµÿecwÃÕ%DFŸŸ‡kÛr”%g||!4‘Þ;ZÃWO-„àηæ€BU©$Ë *Šƒn'µÛÍM©GûÙª·Ê“jU„jh™TI¨€æÇw@ÁßëÿÁÇhûOÃ’ïþÁä[Á5ÂRyË^dզ̻û€}Ïh¤°;ÈY¨.ò"=SKöžà7rvÁm˜èm‹†(Òð8`lKhMŠ\ð”*xS;b ª¬TĵvßQxˆÌÖ< X@+…´ -–`¡"ê -m õ¬8‰X(·$vKì²èª8Ònçt¡ -„1ÖúPÚ -°XvH6j vÉÆ Ni[rbÛÎ{7¿ÃÏ\p¸“+_P¨fW/ …ŒÀÛì¿©-F#xëMÝŒE”‹fiÒÅ žnÂM½k“¯W7y"2«ø6);*#ˆL; -¬– -äo÷ØŠqÝÙݺS ŒE¦jq@k -º5<Üp+¦쪥x6=à.`kj0Ñ~^ömBàEÜ1¤u_íÝS !Õ:ZPûŽ†rùüÌ[]Ù²H"£˜¼1#C’%þì¨mCE‹Æ.íôèì§lNûGª,–›4üø´ª›ùê¶ÌB1Rlªm5ÛS»ûRÒÚ¼Œ![îFî0Øq‡ÅCµº_ýã<?݃ßmQ¦ƒdK°±‚ý8qLDœ„]«û AbrÿXdëG¤‡É fP\cMÙiÍŽóÕ:¦e±。ÀÈ¢Þv .uIh;ž\µ ¸ï¨u[`çBÓ`g“|Yï󇄹ºýð ëÌéó5ËfWá[¿î,ë^ûÀ,( ÓNa7òŒD­ßÅ‚iÿä"ðظþÇÎ\»P°lºé €÷º™b¹Êo€fÙ,–™»£ÚÁ2sx(¸Yšøl“§¾h²Keöa³*­ãí¯fo¶ÝâÚ,ËÎXÇUš6¯š/Þz‚ZÞØv´ó¦Ó:ô‹x×VÚ3*ßVºŸ™P”Ñ®¢´Ž.>´WdÙçÖBÉnpq¾iƒ?©BBo 5ë‡SU­qû> endobj -557 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000009) >> ->> endobj -561 0 obj << -/D [559 0 R /XYZ 72 686.127 null] ->> endobj -562 0 obj << -/D [559 0 R /XYZ 72 667.868 null] ->> endobj -390 0 obj << -/D [559 0 R /XYZ 72 519.972 null] ->> endobj -94 0 obj << -/D [559 0 R /XYZ 72 505.402 null] ->> endobj -563 0 obj << -/D [559 0 R /XYZ 72 341.624 null] ->> endobj -394 0 obj << -/D [559 0 R /XYZ 72 193.729 null] ->> endobj -98 0 obj << -/D [559 0 R /XYZ 72 179.158 null] ->> endobj -558 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -568 0 obj << -/Length 1836 -/Filter /FlateDecode ->> -stream -xÚíZ[oÛ6~÷¯Ð£ Ì,ï¤6 ÛšÅ6tmP h»A‘•Ä@"¥’œ¢ûõûHJ®ä(n,{Ùò$šä¹ðÜÏIhtÑèåŒ*˜0%Âh©ñÕÊZU8¾çèÍËÙ§³g'ØJH¢¹ŽNÏ#Ã#mb˜ŒN—ÑûX6_pEã¼Jëu5g6ÎÿÊÊeN.ÃþÉê*«7ùy.Y>ÿxújFb.z¿L+35ÀöâtöiÆ°¤ ü*’pe׳÷i´Äþ+‡/±Ñgë:’Úâ{½ý¾AÞn¶Þ®,aº}û»9c,㦬ðÂDÇ˲ ‹›ª\®³öGyÓ¬®WçËð³)Ã7K¯²õUÚäíöe•·Ër}³nê°N=§í­ÕuNæ )müs™×w@_ž| Šr'g'LDš$FXǼŒPÍtàÿÏpmðFE¬ÖÑ¢wË#_ÇcV•u»ÎÓì2¬Î¾4^Ë@& ÐñhÁI” -hËs\3Ì;ÖŠW^öÒªJ¿„Ý´Xv÷Â#±—•EݤE{¹Î=ØïPfe~>ç*þ@)ÏVyÑ{ÉãYY³*‹pTåŸÖ«Ê)Þýº©òEgF›+Žy.|Dk ²§dpJ8W`Ì39‰S$±¬»#ø·û`¹½Ê[.ƒ°Ýê«6=×AõþJêÅêßÔBy…„…³o]<‘„©¡ˆ[›@ÐñªÄ·³.,ïšF#8\ìñ Dš­}rC”5دØê-Dá»-‘ØN$ÏßýÁ·‚!4ã>V%=Ø…–ð)onx=çÎgÒë¼q–ÅãlŒØ>ÝŽžJ!Xµ3zF›zLxÂ’$RÛ…·ƒþ -¼èIŽAbÔãBÊb6HΙ£ÕàÑLqgP‰TÍ”!ËÑ_ò⢹šg…°º3µÉ)ÞpÃ×9Œ@ŒÆ¿®ëÖ–ÏòÖ-YŸªf„Ó{ÿ0â•Ö³1Áï.ÁÉ]a(œàr‚4†Vp!øt+: >XO3æ@+Bb PËtuÀíN3šFuÜŒúT[_ŸåÕÐŒ¶§.×U–×»ôº7{C½p‹ -ÃN×ëaðA¯T¢h±»ŸÀ7ÙýjåðOnÀ%’ù^œ7gWõýzDu\­=ª¯ËUá¢8üœû‚Õïh—Î…ÿ³ æÎæ i樀—]êÆ™¯AØ°@ñ¹g]¾¯Ã•.Ë;¨"l…, ƶªÁV›Ç¢¯y|jBSoÕý?îûjrhÁ€Ö:™î‡Á{ 'Š©ƒó£kƒd¢ £­5ÖÕ\˜8»× &õ‚áçmЋm7Á3ÚºÎ×ò›׫ñvizvªràè8'«ú@ø jKÑ€Z -¡>pâ°Â—^âË5ŽzžFu\Ï}ªÖ³coU´mŽßH›´­æœÆk -ηKÿ{?c¨?ã_3]ÿûÃ×ì^¸ƒ¾`”âR*’®/iÖUñ –„Ybh‚¸i.xQí”fgC‡˜@câ Ål†B?)2¥®*AR®\‹,$òꈙ ‹&ÁD‚¹3»æ)ÙÈç®$*EW¡ «ˆ•­(Ä-Š¢²ZÀÔQÈjD/%‡dݼä.QXTâ(D-'Rò!Ñ›Êåò.eNa%þúÁ”9²E;0 \×yP±›A¹é…AHnBEaú 4RþÚ~ ¢ø.\ÚzjÝM3Žˆ¹€ÊûµÉ&änAMwk]Ô«‹"o­1››ø2­FJ#7éSönm4`À€~wÅŒstgWõ( ÚO=‰ ÓgâF žl$¼˜˜Š|p¹/ ûÖ>DôJ«oð#6dºä²-4u½V±A¬ÚŠQ #uÅ—€jMîþy'p{%š©ÝãNÆj8îé¦ÂøÓ¥¨Íx?>¯ºf¾QºdÖ ÃˆJ çr±RsõˆÃcçM·<ÊüX=d~lžæÇOóã§ùñãÌß¾}þ§Nõ#L9+%›\6ïÛ&ÎáÖe‚ÌQ™X#¿=AžHt´ký¿N™ÞÑ|í/¡œÚé“ÆáƒQ¸ú£cL9Õ ö€òD¢ãVÔ#zœùñþÜ µpƒp²Vƒ÷ZeÆú²ìócær‰Ö O#;ªÖÙ§ ò£O÷VåÀ†´äÓÿÂz |ð´wÜ°£L™NˆíFAßš O$<î}ÂÿÎyv‡ª85Ó'ˆÂU+gˆæ(d'yEå&È©Žë¹Oõq'Èû?c¨?€6½ˆ™ßUåC<EˆeûþKÜ?MË?ƒ -endstream -endobj -567 0 obj << -/Type /Page -/Contents 568 0 R -/Resources 566 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 564 0 R 565 0 R ] ->> endobj -564 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000010) >> ->> endobj -565 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 265.449 111.003 276.328] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000008) >> ->> endobj -569 0 obj << -/D [567 0 R /XYZ 72 686.127 null] ->> endobj -570 0 obj << -/D [567 0 R /XYZ 72 565.84 null] ->> endobj -375 0 obj << -/D [567 0 R /XYZ 72 417.944 null] ->> endobj -102 0 obj << -/D [567 0 R /XYZ 72 403.374 null] ->> endobj -571 0 obj << -/D [567 0 R /XYZ 72 239.596 null] ->> endobj -566 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -577 0 obj << -/Length 1709 -/Filter /FlateDecode ->> -stream -xÚíZYoÜ6~ß_¡G-P1¼‡HÚ"u @’²–k °%G‡Óô×w(R²´Ö®÷0Ð>øI\i.Î g>GWŽÞ,0ÂŒ0aÄ”äžRhM¢ ->oùtþfñýÅâÕ¼2ÈH*£‹u¤h$µAŠðèb}ˆ"Ë„ -Û*­ÛjItlÿÊÊ•E×þýY~cýêÜ®­'(2»ütñvO2.ú0"…ˆ‰œHûébñyA`‰#âíÈPe·‹Ÿp´‚÷o<££/ÕmÄ¥†çMôûâ·£ã¨pK÷fì‚0æ‘”¼rn›¶*êé&êFìD#…M”À3êÙ‹²šèÞPœq`QÂ)"Bñ@ð‚B0Æñý’ò¸ÌWÆã«u'uâ Â4’ZG»}°]^¢Èh3øé±''H*¢0Ò8¸‚ßÛ¬™Q+"R>‹Z)aÿ|ªvUÎ)UñŽòt¥š"ÎÙT餷ˆËÕcÍÔiìÈOÖL1ï2e¢9]ßÿíÃü ¼L §ã¼è¼ðêLÏ0Hp -*:Ö[|ã‰66ˆ”T=Ѽ BΞæ~‹$Êæ§j‹:¿*lÈÈl©âë´ò\PS¸„† \Ái3(Ð?läjÝ\. ŽoêY+ ÂFŸnÅKÀÔ ®¨«%Åq6ëW°VÚ‘0HrA\ ȱ—=Œ÷jV¶næ|BÐ d ™¬B•(†°QB9pÏôæÌ% C~#£˜²¡rG I¬ýÓSM„ -¤!É’•îìèƽ;MP=ÊÊÿvgº[ÜUåªÍÂ/yZͺleÙ6wmS#§ –HCè]½”4˜÷p`H/œQㅻŠœ1t×ä·ù?.@î[Súg–ÞdíMÚXÿÓ+îè[§×¿MƒÀ4ðæ·-ÁuüciëMÎíž„¯ku´+çvW{¥iV•u0Ŧٵ_]~m¬÷ƒRa `ú¬“^l¹'kØеõ‹¼€MûeZUé×°,V~«¬,ê&-mmnå%jøn×K*\^Ó,·EÿݹÝ=½ñA«·×­:{G‚F¦ ‰MRÅ?¤EàŸÛÚF=ŽñûÇÓã°&/®€ŒR‡aä¸5 ;…—+Û!ð"&ñY[dM^ž¦²ŸÛ¼raw„w•Mú -$ÔïÄùŸ|¦ P¨XÒÇUq’ :È@Ã茜nuˆWÛ½YÁÙ`ç(šð¾¼#I½[¦ß›,B2Àª ¿?Ÿ i=uvç 8Ê}rÁòqz  „åZ­ÝâüÍ&x…xR…œ¥€Ò\L:DºTã´33¸äõû?6@ì.¬ÆðÂA‚¥x8Hï8K«ôÖ6“xÞŠy›_7Q/k™Q;Q/@WAÙ€5ž“c"•‹ÒØ!¨}ÐGpG±q#áNCšš³Ì ;ápð±J§ \¨®KO”þl‹«¾ÕôÙŠÐL³Ê ÿtçÅÕÈä—¶©|ié$ Ø‹>Á¾›9”€øùßzYD¢ÇÎp šÝáÞ˜fë=œŸE§ñû,‚¾­µ>1‹àâ‰,áJŒŠÚÖ4:Në|µþÚÞ^ÚjšF›ÉSC•Ìl½+®›7‹ÃBpÍ8:®§ñwqe†A-Þ½¸;²=ª®»TEx’‡kÀM½5®GiêXë»®H.¬p!ñ0‘°ÙÎÝÞ£õ’'8;DŠoàθËeBâ¯ÍЯ·2tn÷Íå£{5Æ'ö…o}»¯=IhòWá_uMÞ½$² ‘ömÜ zhã‰G²É]-&hkÔágÀ¡‘œ$°cfúèü?ݧ¿†j‘:µ9ºÙÓi¸4ô—O¦à.¹õ§xö L¿pTØîü±¨ý¯Çåm„ïv†ù`s§‘vLÇA'òûPK´:97€;@&fz¯ŸóqZçã<ÖºwœyyÑ_qÜ‹´Ir’¶«kàÛÿƒ·1°Ku<‚9‚ÿÀÉ1cõàà?Ó™Á1Þ>84¢ -Ì—'Ï9é$õC†]ccö:ÝИ˜‰Îí3ã@x¢J72Æz¢ò‰‰1VÏ —bh‚FNô†y1õáíÆdÛÀ–œ==0–J?90¦Jí10¦”ÌHñîQ­›’=50¦Jî?0ž[?i…Þs`,Ô>c S‡Ú‘0‡_é—ñËÀøe`ü20~ÿÆtçx! Wöÿ¨ð/0äá -endstream -endobj -576 0 obj << -/Type /Page -/Contents 577 0 R -/Resources 575 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 573 0 R 574 0 R ] ->> endobj -573 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000012) >> ->> endobj -574 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000013) >> ->> endobj -578 0 obj << -/D [576 0 R /XYZ 72 686.127 null] ->> endobj -377 0 obj << -/D [576 0 R /XYZ 72 632.899 null] ->> endobj -106 0 obj << -/D [576 0 R /XYZ 72 618.329 null] ->> endobj -579 0 obj << -/D [576 0 R /XYZ 72 454.551 null] ->> endobj -376 0 obj << -/D [576 0 R /XYZ 72 306.655 null] ->> endobj -110 0 obj << -/D [576 0 R /XYZ 72 292.085 null] ->> endobj -575 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -583 0 obj << -/Length 1906 -/Filter /FlateDecode ->> -stream -xÚíZKoÛF¾ûWðHÕfßC ôÚ"uŒ^’´ )Ú`“I¹M}gTH™bDR rȉ+rw¾Ù™ÙÙ™ÏÆÑm„£‹3Œ0#LE1%¹„§Z“¨‚Ï>]^œýtuöì^d$•ÑÕM¤h$µAŠðèj½Ž"ÉŠ -çUZo«„è8ÿ;+×9zçߟoîr?ºÌor?¡ÈòäíÕ‹3¼H¹èõŠ)DLTOÚó«³÷g†8"^_ ÕQvöú-ŽÖðþ…•gtô›uq©áy½:ûã£R;娰Cû¦k‚0æ‘”¬ò2¡oì–I\÷÷; -±ÿõÉ~„pöÛ(%(Ûíé”ë1&’œ!f‘³ 2BÎpŠu G˜@ØÉRˆ€kåîò™ª·i"UÌåª *Â0ìþš·Mˆ×ò&Äsš…7 qž5eåo -ÿ¼þÐä5J qüÛ¶nÂ[ÚÏÎ é¢J‚( žÃûÁOé)¦âºð½—Å(zj V`”Ï°F? -¬9?ˆ-÷1ĬQä‚„ ÀŒ#e¨·ÞãhÍC¢.êïÛûë¼êÑ~èÔå¶ÊlÐöêdõúna6-pë²õÞ¯X"mÔø(C†v+…{…ªHRŠ83ÞÀ·7Íõ]}ر³`‡ýÚ…}Yn -›ÅáœÓ¸)í“Å<rÞYÍínOðŒÙÀ)çÈhÒÎat@Š±)R\´;宓‰?4 ‰s¯eZUéÿÍF¤}õPå«,½Ë¶wi“¯ý·¬,ê&-šÚO¹NëöKYøWͻܿØIdA"…tø°mZAùMB…U›®¬ÞÑJ*$¥ˆV.dCºÍ69€‚©®ìÇ0¬–FÏ?ËÖ»3 G°›Å÷£-L„ш0oººJ˜Š³ƒ‡`&îà)èâþèýÞÍmþ\Ôþ—=3\{QBdŒùyº¶=GÙåŒÏ/„®÷ŽÖðÔK !ÈùÖP¨*É:‡Šâ ›ç¡»¹‹z´Ÿ­z›"m6e¨†Öi“† -(¡8ÞºDÿ¨ÿ'o£ï? ŸÌ|÷O^>±%\#,•·ìeÞl«b¸Ø÷ŒF -È™°œ…ê¢(‹Ð3õ°÷€Wî 8³+nÃDïZ4?ÜÛšz“rž2—ê@1¤V× €MÃn"³³ÏSKN\}ƵBZSðG(‰`%CÐÏVJØ?ïîË!Peì$ ÍœÓ>èCeKÀrý™bˆ7}12ÅܶÉ}äºÎ½‹ß`“— -rã« Õméáš‘[¨&¾ó“ö6‡”Ü50ÂEPtë’!Ipo3¬ÚYÛ¢ÞÜyˆÆ,Qñ»´(‹„vý¤.ê) ¿b«Å:³»zP ­§œ¥„ê*q@°5;KÀ¥ 14+èAùT=V â[ºá“ã1ú°L{µìÛ„ Ö©_é媽µR rvÔÞ¡¡T¾8·±ÖVµ,’È(¦ƒl  I´ýk ®HCº\ufi§Ç`/e³¿ ªr½ÍÂ6m#•H¸É¶Í®…mm©]ª”4ð5&„V8£Æ ·ƒpÆ@ÐC³¹ßüçªcøæšxîêiÿÓ»ù[‹ëߦA`Önîs”¬àŠˆ)ózåaKÂW„!9Ï5åÐîjšfUYU<ýaG–æð–c) dÕ^Ô¹2Aß"ØAèì0t nX¬ý ¸FmÛáÕ¹UÃŽ¼DÝë&|ËJÿôÊÔ@×è oGPGµ] Àý¨âŸÓ"¬Ÿ·®ïñJ=«é÷÷º˜r½)na¥–Ñ,×V -%a§ðr;¬ˆI|¾-²P,Áœ*¿ÝTÖívb·' S|ÃæÄùŸC '…,€%=¢Y¤Ÿl9'Iñ-§U+ôìx“îúD7Å·“vN»7ï„`€‘s¿?Ÿ–®Õz ÊږŸ†Ú+®ì-k)d7¸¼Ø§²ÁŸT!¡wšõ‰ã§ªÒ8uj“¼zõœ#²ÇjUjP g ΔjyÈÏJÃYF\Í®–—-w½#ö‚'!ÅÈ`úiÒx&è`«ÔýZIc"G:®éÖè,'d>½¸p½"(vm¾:mÌ°FpAÏD£.êihãéêõýËÕøòq¿.[ïüJµýÛ;mL ´FEσôkömüÅiãÉ®ìÅ°]ÍÅ|6qáz¤†ÆÑœ„6¦¦µ<Ž7ž <| ºÀŸ‡8ž®nßU°œÌwô’ÕÞÍJ\.NBSahYÂQÒx&ê°»¨_–4ž¾¾÷„/¸g{úú‰´1tJHSö•ÐÆ|"m¬]ݪ[N+'J²` -1FË“ÀÚ¸;Bó“€:Ú˜õA?E³S {Ú˜ö‘SÛw>þÛ§ŽõaêXpz u¬Ž ŽÙQÔ±™ÅÚš#¨c:;Ö˵ãŽÙ±Ü±œÅ ò;ãŽm%j¯"¿î)‹|dT 9Lý_Ãÿ´Kj- -endstream -endobj -582 0 obj << -/Type /Page -/Contents 583 0 R -/Resources 581 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 580 0 R ] ->> endobj -580 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000011) >> ->> endobj -584 0 obj << -/D [582 0 R /XYZ 72 686.127 null] ->> endobj -585 0 obj << -/D [582 0 R /XYZ 72 667.868 null] ->> endobj -378 0 obj << -/D [582 0 R /XYZ 72 519.972 null] ->> endobj -114 0 obj << -/D [582 0 R /XYZ 72 505.402 null] ->> endobj -586 0 obj << -/D [582 0 R /XYZ 72 341.624 null] ->> endobj -391 0 obj << -/D [582 0 R /XYZ 72 193.729 null] ->> endobj -118 0 obj << -/D [582 0 R /XYZ 72 179.158 null] ->> endobj -581 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -591 0 obj << -/Length 1839 -/Filter /FlateDecode ->> -stream -xÚíZYoÛF~ׯà# T›½wùÐéáA[¤©HÒ‚¦h›€M:$å$ýõ=Èr%J¶(5 -?qIí;ßì\6Ž®"½X`„a*ˆ)É%<¥ÐšD ü¼ã§×/ߟ/žÁ§¥’Êèü2R4’:EŠðè|½"É’ -MÖ®›„è¸ø+¯WºvßÏʛ­^—…ÛPåEòþüå¥\ôvɈ"&:àöÓùâÂÀGÄé+PJu”ß.Þ¾ÇÑ -¾¿4üR}´»n#.5!"ößêõݺkÝ:óÜ2Ï¥¼-P²d˜Ä?ÖE»›Ç‹³wXÀg°Ð³3Â"‰RÅ´9#‰”E I"݉þtÛ‚S ¤¥Š–£]8’é÷ÊæMÝúu‘å×îÄŸûÃÖ—þ×Ö"$t—„ T'¦¬àô°O¿¦É>ûeµr‹­Ãj°i]µ]b6uîC[X•´ ϼ.. ™!Ïˢ귰èþ …{ñºÃÊë>0¢Vw÷aݘ ŽYüCVy -ÿóº-¼Æ—ÖO€ÔÝ•¢WhUVWÖ 84ܸH2“îØf±*ìíJ–Bêøl]å]YWø°.ã æí®)–½I†]FËÑ=„÷ >‚œr…x9vz€©Ø„cp”jÚïat‚]Âåþ¦ðZ:{›•ÅÔjµvž`·dÖ²öLžÊb˜;ý7ç ÞÖë¨Tˆ¦Ó^kÛUP¶l„1AÊ. $mKÀ“*$´r¬_[|ll7¹ç¦i(ØF÷¶yþæ I…Yš‡!éˆtÉÐr¸X)îå¿J(f·Eg1‰§µ˜°ùëf”"„{£¬"HP6DÚSÒ#’¦‘à°‘}<`·Û±°A^±‘åX [^Úˆv–3niLš*æ - &B! Ë@èÏEuÕù,jƒŽÉ². ÁÊ…=Ÿ{ཬÜÓ\‹ ºÇ¿¬!ºkIÆÒxŠN{ÇúnâV*ðša÷Ž3„èm#p4Fù +„è9ct¾÷G'¦ˆ(u¤÷@¢HF‘êë„û½î3Oê´ûŒ¥þº¾½(šÐ}6¦­×M^´ûp=X½ª¡ÞÐóq=ŽÞáŠ9”0zÿ(ÄK²V -÷’*P#Nœ}¯.»‹›v7®³¤NÃ:’úª.+½á~S[³@u<™Ã¹¹ÂȽäÁ Îáâ38(w‘,IüÙ”…Ó²OÝð›­AàÓ¸F±¹œÐ!ß·nKŸå Uå>¹,ŽÌs¤}úvŒþMßK—ð!ßK)„?ÎìÓWàP$Cj)Óù7à8z{xJ‘ âè¼hÚ$žJD°÷ƶI˜Šó—`¦àÉ[~î‚Ql»s7£uo¶œ"\Ÿ"]¾éÃÕ  2äÐÈ̆úHzµÆР[D94ƒâ«‘Uáj‰iœçIÆy,õÑ8õÊ*sÍýu™¯ˆŠãµ —@·ÿƒâ§\Ã3ÿÃé§kukÜ 2Œá€\"ÌÒ¾éÖMõ¨N„h¤°i”43G^Õ•ŸâìmDä! !1Ž¢†¡2¯!06U ô%uiºd†!¯N¸ÓH -1 úó½¡ØôLé`ŸmK¨%dS¦ÒÜ›BÜCQ4!V2ºŸBª„àEÒPªžlË'àvçñB5EëPè]cjÀzµ-™bã$ê’)†t˜ÊPrfZÎûOÔÁl¦RÉ’KaÙ7)jÜ;3Xò¡ô€ªâ·iã„Pmò4#B…vTŸLq‚üMéPŬ«¶¼ª -ï‘y¢â묙(Ü­¶ë£@òe¿ÇT ´f7í¤) ÎÒBµØ¡‰1…Ô…ä 1ßa×”©CõX2Aðê«ôaC‘Úg˜M›@g7*d ÖF Z*†°©ð(*ïx»G ÀCÓjf›âQPN@'Z*75yj˜ÃËDzïä·Æ–&µõD?•B:Õ6rJ*žFÍ_ï¨z›îiÔü4jþŽšéÜY³ü³f -GåœÌ.´¤·%Q­N2k¦oµâÏšg -쳡_Û¬™Ñ=mÚáVÑrS/Íöžãè÷`¸pÐIbÖL±a5Ï:í=#¡§™4®]ˆ -+(g£z½E•(mK¶LšIÊ45Ï; k öiÖüÅgÍCø°¡ætþß`¤ww@JèÉIfÍD¦H÷C£‡fÍ3O_ƒ±àÿfÖ|¸º!T@ŽÕüYã‘ôjaQdÖl,/0Ĭy¦ÔiœÇR¿ì¬ùðc„ø¹"ó‹˜ô}5òÁP„hrè?×ýèzF8 -endstream -endobj -590 0 obj << -/Type /Page -/Contents 591 0 R -/Resources 589 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 587 0 R 588 0 R ] ->> endobj -587 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000015) >> ->> endobj -588 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 265.449 111.003 276.328] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000016) >> ->> endobj -592 0 obj << -/D [590 0 R /XYZ 72 686.127 null] ->> endobj -593 0 obj << -/D [590 0 R /XYZ 72 565.84 null] ->> endobj -395 0 obj << -/D [590 0 R /XYZ 72 417.944 null] ->> endobj -122 0 obj << -/D [590 0 R /XYZ 72 403.374 null] ->> endobj -594 0 obj << -/D [590 0 R /XYZ 72 239.596 null] ->> endobj -589 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -599 0 obj << -/Length 1921 -/Filter /FlateDecode ->> -stream -xÚíZKoÛF¾ëWðHåfßC ¤ml h‹Ô1‚IZÐÒÊ`“.)9I}g¤H‰R$Ê@zè‰ËåÎcgfgf? '· N.'aF˜J0bJr O)´&IŸ÷|ººœüx=yqSIer½HM¤6Hž\Ï“÷©@dšQS[åõºšÚ¿fåÜ¢»0±¼·ate6,(fvúñúõŸ¥\ò>cD -‘Óãöêzò÷„À'$è+¡:™=LÞÄÉæ_;~F'Ÿüª‡„K Ïûäíä÷R­rT¸¡{D‹ÓµAóDJŒŒ‰V¹²«uUÔýMÆ'TuȉF -›$ƒ'f4e Ô“½%8# -üÀ’ŒSD„nýàUN3‚1NŸ¦”§år`<½]x®=¦‘Ô*‘Ø탲EF›ÖN»– œ ©$°ÂHã&@žìl5 V2ÐR<‹X)aÿ¼/v^ UqÁžE¨¦ˆsÚúá-Òr¾+™:‰~ùÙ’)æîLô%×µ .þ€žf\ªtYx ¼¸PÝóË’Ü»'»·ÅwaÑÖæßÄEÃŒEŒÐfÍÓN”!†U³j]ÔËÛÂÆhœMUz—W -òɆJhБêl@ò›%·‹ÕÍ”àô¾T lä(%TW‰=Š€%¨i-QWSŠÓÙ YAÊOÕ#cßÒ§‚ŒGéÃZ1s[¯†lBÐf  é媭•)†0DF9P™@tyábFáP!£˜Ž¼]€2$IÔöÏ°ªÇT -ìn³J{=|­xr GY…wwœýà±*çëY|ù´\Å*¦ S*"]˜+׫ÇõªFN6¨.‘†Sæ’¦¤ñÔ¼›BZ1”D10؈—òqµ|Xþã]¯«Ò=i:Ëïgëû|eÃôŽ -Žrí4ã[Ú¢ùîÝ¢›Øðu‡QÔ½eD½îa¢ ”Œc–þ”‘"~^×6j¼ðq¤¡Ù±BóeqëÍ€û‡è„ÀÉL†m»ÁÜúöhš ©Ó‹u1[-Ë"|ªìßëeå‚Á½=V6‹1æLÒ®rú{Žá!rå%ßÍ ½ÀàPiÚ¼Åè?:…‹«A­`o7r> õZ‡HðKroY¿§Hå}Â˜Ø ÷1ÄB4A<Ô -roßèMÔAØ ´Õ’¹ÚìºL?¸ºÜîvÁŸT!íQlëœ| {ToÇ]-oëØÛ·¯8"[ï¡þŽ3 çp¶R<ž©7®¡Ë«üÁ®\3MÒaE†lÝ¡VD씡Ý”µýÉsÒ#bLÂ( Ò°:ø»Ó")Ö­€`1ìy1¤©i{ŽP¸Þy¬Ð~#/”wÙú‹-n›åóŽ»)…œ4På–Exº³ãÒ$øô×uS¿ éõÚ:+ÓÄÖn¼]ð}à Yz×AM<Ý -}ï9æl|ôœG¢Ê»ÖúÌèÁþááJtÛÞð'u8|ºR[?Üت>ÛAS—ëjfëC~=Y½¾_\ËW’Ñ~=Þû•iøðà®aÈ~¯R¸S•plàI6÷†ûz¯_GIöjWê›®Tέpòm #l°Œsw„(¿ä«EœÂ%qPîfš‘ôË -Ú´lª7|ómLuÚ”•/然%¿KšB見0 -=L´YäH› -m*xj>”|éî"Ýšß-îƒGàTOöØ3=:þÏ#ᯠ¢à©s‹¢Ã¹˜æHÃ=¢¹­2—Ͻ'`œàÁ3Ðü2^:‰í1‹:¼ùv¾MoM}l/t{Ü|²º}O9¦ãûŸ3郫¥FZÛÿ83€9€'¦ ûyœÔa?w¥íg§Þ²ÈÃ5ÇOä«<¶CQYû<°ºCþ?y}ÿ¹Tã;˜ô'¢ÌŒqÔ4ßdV'‚Ì:¡ -Ô—çcÌÊsjpyb–Ï!4"Ì]¡fþ"=¾Ìz"¿/³gÐeÚ“›»{æÓç>À¬÷Ì‚ÓcfuÀÌŽ˜Í(l×0Óf}¾‡fv,Â,G!Ì‚ü0B˜ëåçq°²h@VA»¼û°²ˆø%<»°2D¹,YD,Y,Ö4X2ôÐKî±FÜœcÇݽ56²hAXÑ‚°‚Æf  ƒç…F od#"‚ sa‹0³ýtÀŒaÞK™AÌæ½ÍaÝ3†É¨.LGua.03v̘7˜±£ˆŸ#f 33vl[ÌØ+ü5̘R7 -ƒ3f˜u0c÷iƒ»·îe¬]Àz~yЩŒ™Bô[ÁÅN©æ§Ýõ¥Ó9ºÝ- ·H¿£H܃ n|OM»ëCá°B‡J¨Üº;þ§@â—ïþ8øgh¸ “"§þ™á_ïìç+ -endstream -endobj -598 0 obj << -/Type /Page -/Contents 599 0 R -/Resources 597 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 595 0 R 596 0 R ] ->> endobj -595 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000014) >> ->> endobj -596 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000018) >> ->> endobj -600 0 obj << -/D [598 0 R /XYZ 72 686.127 null] ->> endobj -379 0 obj << -/D [598 0 R /XYZ 72 632.899 null] ->> endobj -126 0 obj << -/D [598 0 R /XYZ 72 618.329 null] ->> endobj -601 0 obj << -/D [598 0 R /XYZ 72 454.551 null] ->> endobj -392 0 obj << -/D [598 0 R /XYZ 72 306.655 null] ->> endobj -130 0 obj << -/D [598 0 R /XYZ 72 292.085 null] ->> endobj -597 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -605 0 obj << -/Length 1934 -/Filter /FlateDecode ->> -stream -xÚíZYoÛF~ׯà#”›½‡HÚ"u @’´D;lÒ%©ýõ=H“2%‹¤ä!O¤–»óÍÎÌÎÎ|6Žn"/0ÂŒ0aÄ”äžRhM¢>ïùtq¾øñrñì † 2’Êèò:R4’Ú Ext¹Ž^Ç‘eBŽ³2­¶å’è8ûgU¬3ôΟmn3ÿv‘]g~B¾Ê–o/_,ð,å¢× #Rˆ˜âž´_.ÿ.¼âˆx}2TG«»Åë·8ZÃø +Ïè胛uq©áyý¹øãA©V9*ì«}‹ÓµAóHJŒŒ Vy¹¤ÕY…–„8þm[ÕaÔ…ö³3Bº¨’ Š¨çð~ðSzŠ)¤¸n&|ïe‰C€å¬Ñ+FN¢YË} 1k93† !(p'ãHê­÷þ`MC¢.êïÛ»«¬ìÑnèTŶ\Ù ÙïÕÑêõÝÂl6šáÖyë½_±DÚ¨Ã[  ²ß­îª"I)âÌxß\×W·Õ~ÇN‚ököe±Ém‡sN㺰OËpÈyg5·G¸9Áo0f§œ#£I3‡Ñ)ö‘â¢Ý)wµLHü©^’8óZ¦e™~òßlDÚ¡û2KVéíj{›ÖÙÚ[yU§y]ù)WiÕ|)r?T¿Ëü@+‘‰Òáý¶ne×K*¬Ú4±zG‰THJ%.dCº]m2;tƺ²ðZ=ý Ì[ï΀0Ánf߶0F#¼éªrÉT¼Ú{&âž‚.îsï÷nn»÷ç¢ò¿ìÁxÈpÍE ‘qÈÏãµí9Ê.g|z!4s½w´†§ž[Aηæ€BU©pHÖT{Ý< uØÍ]Ô£ýlÕÛäi½)B5´Në4T@KŠã­KPðôÿèmôý§á“™îþÑËG¶‚k„¥ò–½Èêm™÷»žÑHa9–³P]äEz¦öpBà‚3›p&ºmѵ3ÜÛšz“bž2 —ê@1 ]¸ÔÁ4Lá&2­}[‚p‚$' J!­‚)ä{(‰`%³ùæ¨R"BLu] a*ƒ¸›9‚™cݽ/mX¬#SlƒD™b¸ -ì#§¶í|ÿ‘z7¿Á/. $åÚWªÛÖ3xåmÙÅw~ÒΡÖn{”aA„" -*tj“!IpwSÚV0Û¼ÚÜäYˆÈÕRÅïÒr 4`)­×F=àËfŽ-—ОÝVƒZð€™¤…îj±Gk -Ѫ 77¤ÅÕ»¦Æê‘0Iü‘„ yŒ>¬-P›ûe×&±N+H/aí$ªD1HpPÝQ{‘†zùüÌ[SÚ²H"£˜²1#C’mÿ(nÒ3“Î,íôl¨ì¡ö·TY¬·«ðãæéæ«ÍÇp›më¶}m}©]º”4p6¯àÀÙ¤‘M»²I\Ü×›»ÍÎ?ðÓ߇$nkj¿$àÂô­…õïi‘ú9 'C¾–þ¹Èª…ûÍÈ°FÜ̱ãã½5®Ê¢ -ï BÑágûš€¸~À’ð¼Ø‰ÁÐPÛ~§ùÚù-ÂHÓw„áÌiãFºí„ïü¸³9Ìóºg~0¨ ÃA]ó‚„o_Ü@ ç,þ)ÍÊðyë;rí‚ÀŠu´fÖ(¼Þä7nç¸ßÒd¹åÛæ«P-Á§2ûw»)ÓáW·)k§8å­8ÿê8)ƒlwD¯HŸì8GIñ§U*˜Þ:¾´:·Û)¾›t; -«¼;àÅG‚}ñ¾§¦Ýµ!X¡P% F/ÆÇÚ)­ì%k d÷rq¾Kdƒ©BB·å™uˆc§ªÑ¸½”Û[àù«¿è£}¨Jƒò×h§*ü¬”1ƒ«Ž«É•ò¼å®Obj$¢SÆŒbd0}š0ž:Ø&õ@¿V˜ÑÝÖxkôƒ–2Zœ¹ÞGæ.Y‚2¶×(thGPÆQ‡Ã¨‹zÊx¼z}¿Àruxùa¿Î[ïüJµý»;eL ô~FEOƒôköeüÅ)ãÑ®ìÅ°]ÍÅt&qæz¤FÔ˜“PÆÀ´–ÇqƇAøóÆãÕí» -–“鎞³Ú»Yd¸8 aL…A¢aÆQ‡}ÜEý²„ñømô½'|Á=ÙûãפŒ)…óCÙWB›ʘ琉¡—²u«fl6e õ™%{š2†»â°–3†ÞƒÝÏÃUs -PËsÚ}‚3Óg"S¨Ú,×C®ªÌ»¸¡‹Õ>ºX ùÐ|짋•OÒÅPA3> endobj -602 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000019) >> ->> endobj -606 0 obj << -/D [604 0 R /XYZ 72 686.127 null] ->> endobj -607 0 obj << -/D [604 0 R /XYZ 72 667.868 null] ->> endobj -396 0 obj << -/D [604 0 R /XYZ 72 519.972 null] ->> endobj -134 0 obj << -/D [604 0 R /XYZ 72 505.402 null] ->> endobj -608 0 obj << -/D [604 0 R /XYZ 72 341.624 null] ->> endobj -380 0 obj << -/D [604 0 R /XYZ 72 193.729 null] ->> endobj -138 0 obj << -/D [604 0 R /XYZ 72 179.158 null] ->> endobj -603 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -612 0 obj << -/Length 2168 -/Filter /FlateDecode ->> -stream -xÚ½Z[Û6~Ÿ_¡}“јáTh³ Åî¢Mû’f ,ÛÊØÒT—$³Aÿ{/²%‡vÆò O¢(ž Ï磣U„£—WaF˜Š0bJr O)´&Q Ÿ|zõòêÇ›«ç×0• DRÝ,#E#©¤nÑ›X 2›Sã¼N›®žçdÕ"Gk7]lr7z•/s· ÌòÙÛ›_®ðEÊEoæŒH!bJFÜ~º¹úóŠÀGÄé+PBu”m¯Þ¼ÅÑæ1ü}°«¶—ž›èõÕo;6nïê`ïB#"ýÞÿ;#„ÄyÖVµÙ!‰Uk4¾¯«E—µn¶ºo‹mñÿ|á^ÛÊ=³t“u›´ÍIS|ôË»û®mÜ8õ,R·øäh»fñ?«¼9 |yý;˜[<¿&,’(QLÅÖˆ'$bHétÿŸ[6ÚŸ@Zªh>X¥# ï­×0««Æó4[»ÑíC¿­jéw½¶.î„#&t4'%B89E {†… ÓºNÌPÄi¹psn‹0“UeÓ¦¥_ÚäV ˜·R`&«ò匊øwŒiVä¥ûÎÍaÓ=w“^]˜öêÂœc$¬ºn¢k;ÀꜳøEZz -ÿ¹k¬[afiƒÀ°µ‰÷ -/ŠrewŽÇ[†$€,UTûÂ`‘ÛÔc_weÖUé>ÕùŸ]Q[§ÃÛ}ÏûÚ-±Êvî!}$ð‹)Sˆ‚*V° „G‰Þ­a4ÀÅŽÎáò~“{½©a4ð¥ÑÙ»Ý,IQÍŽ<•s \$˜ó=Mv»v1dcŒ -…¨12øç±ÆEÈÖ Srì -ÌAéR…„VŽß+ë[ÏšFîyh -ѽE^¿þ‰#rP©0Có0Ô"PÏ9rù#â^…_gÔ$LºÍ[SYIV$,àðëaÙ -'˦"HP¶+OIH’D‚ÃFNñ€ÕÎÉŽ…­ÚŠ ,GÀbØò‚³Šhg9ÆT£MRÅT¡#gˆ@ ÑÐååªõÇ¢«‹xW3qü~FÄþ0ÁÏîi2¦±UÇÿîšÖÏæ>/ÉPª$ˆbÑÇØ÷´T=» üÎñ"}n Ç(Ÿ`q9ctz]F&ˆ(uaAç¡À¡Œ"Õ7ïO†Ñ4©á0JýO·½ÍëqOSuu–7§üz¶zc¿P í…žî×Ëè_1‡ŽEŸÞ…ºIŽ»•B~Rê`ĉ³ïjÙÞnšã~$5ìÖÔ_«¢4UòœÚ~Åty¡#œ›~ÄáK¾x„³s¸¸#Ü(w;›“ø¡AÃç´ôg·ùfâÑL ûs˜›oý߸%þ˜·T¥›²Ç¼™Øqdž#í[DÇh’Ï݉/’RøƒC>œçzrÁ@-e2=.£·ÀŠŸÿðD"‚}46õŒ©8;š³`$øßj۽ˌƽ9øÔW¸þ¨t=úQOŸ¯îÈU† ædW_Hï\­1 ÏK[!èŒ94³m€µø"oÚã~ž&5ìç¡ÔGûÙ¨W”=Ê1i›úhFqÜÙR°ºSþ?{cÿ)‡x&ûÿ|úpÏn;Â@†1lK„YÒ#“¶«ËG¢‘ ÔM äÌ‘—Ué¯gNçaLL ¨Ým¢Ð‚ ±éJŸT…s«e ̘F’&Ó ??YŠ |JvöùÜ:E ­6ÓiîM±šÍÍ}S(¾%|úrE‚4NÆr³´Ëf*^›¶ìÄCEÐŽžB~r!ÍGò·i[÷PÙÜ -Íæ\ȸ+›bUöàÚ*˜Ö¡æ€b -tjta±[“>s+ÆšAë‘û;ž6À…Ð!›m GX=†Í®+º pIÖr¿%1ÆÞi1§úŸSŽXoÔ—y™×þÂǾ½O¯gàe÷º3ü °o¥%îÖsô—I0Zö}¼½%*ÊÚ]!A£C=Šæ|/š3èÌ ð>¦Û{{ùÊýÅ–ùàºÙ f0ÿaÛ, X«µ›¼¯j_…9óü†By\4î[±NEPëg7åî»`°©ŒôÍÀçËmxm&û[h"ë.k{S¥Þ˜ä¹‰ó½|ãïz?ß”î‚î]ð*”ŠLöLÿááò»g¾ëøö~v7'ùéo?Ý=Û«Çê?”6ù}·ÒÝÎC¡ñå jÖU·YŒ¥(g¼Ç|u›ÞnrtÆMR¢‡|šS ßéW¸Ib*šžŽ/¤·íÕQÆ/kŸà¨£ hBÌÙá -ßÑÖi¢Ä`ë4”øfûñî­ž}Õ×’uÕK ·öGçë:r!ÇlúUá…ôÎÁ -Ž?}¡1À)@ä;šíqÿNvïPb¸Þ©]lÆ7ƒÃ2‘Uu7÷Ué‹û)ÕY3*‹÷imª³ñ‰–ùìí= -ÔR“éq½‹É`º8å¡M£R!BØ »‡Ä4‰á˜Š ÅDVmºm9=$Nùþì}Œ' 5ÝùçÓŸ —(…„Ãü2¸DŸ -.‘³á‘ ?áO— +JÄãàÒSÈõpi$wÐrŒÅJ0´WòR¹Öõj,÷+Á$ú40‰%˜$“ X1•8˜$N ¤¯ ‹Üß2cäõŠŸ¹Ræ{ Ìx„Žs¿!Û;tdÞB -šyŽÌС#Ãb‡]ÌtÏo(´ðÔ{tdȆ+~v‹ŽÌ`ŽÿØËSž·Âctd&Rÿ!ô¯‚ó§û¯ñ¨…øUŸŠ@2($=ç“oïæwßeù}ì!•yB* ï/ª-xtóྺ¸`Œ˜·ëÊïØƈµÅºªçKuÄ—Êœ§þ;uù‹}Hà¿CSÈ¤Ô -endstream -endobj -611 0 obj << -/Type /Page -/Contents 612 0 R -/Resources 610 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 609 0 R ] ->> endobj -609 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000017) >> ->> endobj -613 0 obj << -/D [611 0 R /XYZ 72 686.127 null] ->> endobj -614 0 obj << -/D [611 0 R /XYZ 72 565.84 null] ->> endobj -532 0 obj << -/D [611 0 R /XYZ 72 417.944 null] ->> endobj -142 0 obj << -/D [611 0 R /XYZ 72 403.374 null] ->> endobj -615 0 obj << -/D [611 0 R /XYZ 72 312.543 null] ->> endobj -531 0 obj << -/D [611 0 R /XYZ 72 201.31 null] ->> endobj -146 0 obj << -/D [611 0 R /XYZ 72 186.739 null] ->> endobj -610 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -619 0 obj << -/Length 1605 -/Filter /FlateDecode ->> -stream -xÚÅYIsÛ6¾ûWð(M#;C{èLíINmêž·CKÅZ"].µÓNÿ{!J•HOzDâíË÷áè!ÂÑÍF˜G±Xr «J‘¨€×G^}¸¹úþöêí5<ÒHK*£ÛMÓH*b£Ûu´œ Dæ *ðÌIYs¢fæ·U¾6hëž_§;ãvÌƸÙÊÌïnß_áIÊEË#Rˆ¥·n¯þ¸"°Åqú -¤©ŠVû«åŽÖðü½å§UôÜœÚG\*XwÑÏW?ulœíñíB!"½íÎdkÖ¨|föŸÝÏ)žÕ•{µÎMévY^¹÷uR$YeKZOI‘VŸÜÃÎg©'î¹HÚMÿØ/×ÐÙ/¥)ÊV/ÏüyN0ˆ­BÛ“õïuéÙu!x´V¿½&¤—\bD…͵Æß¹#AÒ,Ú3·:(*ìÖ.7vB÷9`¤µŒ”!%‰£ÿqN­íÉÞT¶¦È¬ ù®ÿ÷_ †ª&ìdÁÄ ʺ¢yMzD´Ž„¦à-}Šœvu,šzYÏq„SD5^ î=Ÿ4Ž -L&dŠ±"ƒh# Û@ärÿòxçz`RMêÁ¶I6X·ùnív«ÜllÛÒ[¥&«Ê/uœ!FùeƒYòø4ùÉO¤w!VÐ̱˜b¬8°¤ÎÝûã'q8Â}‘Y½¿7…‹b¾qk‘ÛX>—îWÓ¼`í:bï¢0åSžyÜè%EY¬<á7nñš:‘ÛÈ9–ã“b½K -©šn9µîDd)¦\„'Å8‰ÃIÑ9”«|Wï³ñ9q*øÛȱ ãƒ9ý0:5Þ È0TÕιLUÙ0êG¡kÀ_Pµ›g~=‰¼$†I—†ÛLQÝÄ‹Wè|A0†!/+Ó‡ÌØNÕl5gÛ¤p?6IÇHq¾cØÉ - ^éÎY_º…@¹)œÒÌ»RŠQ~ù±Àóòˆ’Í°Ó½FXvãLâNBဒí@‚Î>`PÇ1Ì.1îuü2»ý&0;³7Íø?n®­ÆÔÏY,²´¶˜6‘b1$‰ÇÔ_F-óÈêR†m±} KsÉüß;ö“Ø MÔWÀ8¤*Óãkq"}Óˆ¡‘# -^¯1€q ¤ü¿°‘";q ò]öTWaÂm£—+ºÈ1SãCw9ý…m”Ù·2±^§¦^ƒJ¾÷ˆU¯ü-@µMü«Ä-/ÁÁoÝò7ùgZSf¾)§"ÇZ0£€Tà ¨˜Ô‚™@˜S` AEЃ-ô9«†Ò, ñ«(—1‘¡Ý@ÎF>Ik"ß»àj"¨‡þ ØÎ…ÇñbÄ¡X¤“gá¡ìãáùȧ5¢J6È'8ÿ -ÈG…„ïÊñÈ7‘¾A>Ê9z"ò1H -úp…ˆâ]c8}#eBßÌú|ŠE¾Ëu]äöìèÐM£w¡ƒª£œM ¸Z…ÞãuÛcŽ‡nœÌáÐ…2CwT—ivàê¨ïl]¾ó¿¾É¬­Ý%ë9¹q±‘al-äBÓè]n"¨×¹P¤”!ËV gÆ(‰Ã‰Ñ—X¦™ðZ¡ŸËì’áx$/U* PKMÆòrú Ç[¢9ÌLÇ[_‚¸«¸•)ËM½{ãÝ^mÛ‹MóBºó/> endobj -620 0 obj << -/D [618 0 R /XYZ 72 686.127 null] ->> endobj -621 0 obj << -/D [618 0 R /XYZ 72 617.267 null] ->> endobj -521 0 obj << -/D [618 0 R /XYZ 72 506.034 null] ->> endobj -150 0 obj << -/D [618 0 R /XYZ 72 491.464 null] ->> endobj -622 0 obj << -/D [618 0 R /XYZ 72 430.546 null] ->> endobj -533 0 obj << -/D [618 0 R /XYZ 72 342.337 null] ->> endobj -154 0 obj << -/D [618 0 R /XYZ 72 327.767 null] ->> endobj -623 0 obj << -/D [618 0 R /XYZ 72 268.906 null] ->> endobj -520 0 obj << -/D [618 0 R /XYZ 72 169.442 null] ->> endobj -158 0 obj << -/D [618 0 R /XYZ 72 155.701 null] ->> endobj -617 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F11 313 0 R /F59 309 0 R /F73 498 0 R /F76 529 0 R /F13 312 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -627 0 obj << -/Length 1839 -/Filter /FlateDecode ->> -stream -xÚíZYoÜ6~÷¯Ð£È2¼‡HÚ"u¢@’òZ¶¬%GÒ:Í¿ïðVZK²Wró”'rErføÍp.,Žn"`„a*ˆ)É%ŒRhM¢–G–ÎÏN~¸8y} -Ÿ 2’Êèâ:R4’Ú Extq½"«58Nˤڕ+¢ãôŸMq•¢[ÿý4Û¦~vž^§~C¾IW/ÞžàEÂEï׌H!bÊzÔ~¾8ùtB`Š#âåÈPmîNÞÄÑ|ké}v»î".5ŒÛè“ß÷BµÂQa§vˆÓE„ Œy$%FÆTÞ­(“2¹Kk{eWýûN²8\}t!þS÷¡eí^ò<"ÆD’3$† °› #D á€S¬áQòp…¨Ö!—8 zW&xŠ¹,¹ê² -a˜öXþºÛÖÙý6Û$ù•·Ô!pg”Ï¢½%#ç«nÑq¯9FÅòe4Ç8R0:/Ç57å°æº,kîrBsGKчžÙw¾@uÇŸ?Ò iæ¡9Oë]™»Ch5RØDk1 Ⱦ+‹«Ý¦ö ×ͳðÃl7d¹ÏN?`©eùú”°H"£˜v°DX0$Áƒ¿ý¶ž i©¢ug—ŠÄß¡‡ÁkÂI wàÖàTšØ©X­ Æ8~°>¹È¬ìØÄ7×æÊ4â€# ›ÒE¸á®µö"œ N ‚‹7Aá!@Þˆ†Ð&^„«$àxŸëU1ÄTq$åË\U)ɬÏô‚žˆ‹€µ5‹ÕšCäÏòÚë]us -fÀð8ðpg·iþÊoêó˜ˆj6 "a)š=#”(;#Í®]^e7yDݬT|›”Á†y×8áš’5§>`Ì4e{‘›ëúrEp¼­¥ÐHr³\ŠI,¼…¢*WÇ›\…Rÿ?WiUÁ€ítO¨yîîjÍ¥@Ê­)G,øˆq·C‰MבÏò:²ëuœO{°v ï¶(ýoûšÜäÞ;ÈWþW ¸çx+÷e–Ôi—BYeEŽ,wÝ>¸ ix0?©%À©s²œMÜJ`¤ÀÅÍô¥Ž‡¿p¹oݼå¼)‹*H‘&›[¿åò‹» |sa¾Ô·áC–ßïš³e™|ñË><47¡ñ¦È«:ÉÇ*­ûÔ6Ez½¢ÂÚÝdi^ êÂ^ÄÔonÄ¢^,§ÆuÝ¸iDÕq±«AV´‚ŠÇ?&¹_¾ «»ÊY<|¹vŠ†‰/gÂ:Ô3Y~r[Ýøy¸ªãv%'ºË75¨Û/•é§]Vzí¸MºÞ$ÛÍn›4[LV{ÀLÌèÀƒã`5tàÁõ”ÎÁWÓ®û ×l±â6"´VGAÖ€ƒ&m|O<.61Þꂾ×=LkÐ:&Ø\Üfá\ï²OÊÖHwYž†ÕÏ·IÝð¨êr×Ù -ÆÓ<³2È‘æÉ嶑²ÍLªt ¶:yêm†uûžëì.EUêT -b«? jM¢¿BÈ!Œ­fç£ Ï»Z‚[ž³eµ‚XZÖW™6­&f2¬&zLIó›ú¶Ÿò‡3 š¬×>®*¼ü_wU0 Ë4¼arŸQÜåï^°BŠëfÃwž£h¼ª9¾`ƒôôñi+ZvÞYƒºEª…½($$ÄRv<à˜Íä:lF]®¿íî.Ó²oF‡ÆS»r“Vz=^¼ž^ìq®g«uÙq¯U-à"b™VÁ› -¹ŽÖàUé>­ÞVãzÇwP¯=¾ï -(:œb)óÙ Œƒ±24ÃéŒXMÛt fM †©3#ˆ%ÝìÁÅ<ÊÚè]…ó!fÛS¤]Šô˜Ž6%µy–J!­x¶=ÉÇŒ ˜†zÎÆ@@P}Ή­ýþõ:ÍPÉÆš¡Q„zºj-ë©f(5äÉf(Û•í?u¢ý§!âÉö_‡ÿÍPƒ0çË¥o†REŸ× 5ûGÉ!Ÿ@c îÍyØ^ïe¬+Jо!þdS|§fÄ7E¹9¢+:«øŒ®èP£S,itÎjß~kt~kt~Fg'ƒ°ÑÄþiÅMÎÏÿ<ƒáM($´j²‹˜ûG̳Rn£OÛzóç_“{üIMŽýÛË -Oõ -endstream -endobj -626 0 obj << -/Type /Page -/Contents 627 0 R -/Resources 625 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 624 0 R ] ->> endobj -624 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 157.861 111.003 168.74] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000003) >> ->> endobj -628 0 obj << -/D [626 0 R /XYZ 72 686.127 null] ->> endobj -629 0 obj << -/D [626 0 R /XYZ 72 667.868 null] ->> endobj -387 0 obj << -/D [626 0 R /XYZ 72 567.305 null] ->> endobj -162 0 obj << -/D [626 0 R /XYZ 72 552.735 null] ->> endobj -630 0 obj << -/D [626 0 R /XYZ 72 434.341 null] ->> endobj -373 0 obj << -/D [626 0 R /XYZ 72 298.401 null] ->> endobj -166 0 obj << -/D [626 0 R /XYZ 72 283.831 null] ->> endobj -625 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F13 312 0 R /F76 529 0 R /F14 318 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -634 0 obj << -/Length 1835 -/Filter /FlateDecode ->> -stream -xÚíZYoÛF~ׯà#D›½‡HÚ"u¢€“4E;dÒ!©´ù÷=$seê"•´y"ÅÝ983œùö³qrŸàär‚f„©#¦$—p•Bk’Ô°¼céêròÝõäå<2ÈH*“ë»DÑDjƒáÉõ<¹I"Ó8-ê¬YÕS¢Ó⯼šè½~±Xþ+ü†2/¦ï®_Oð(ç’›#Rˆ”òHÛד·8!Þ_ ÕIþ0¹y‡“9<mõüív=$\j¸.“ß&¿>9µqŽ -{k/!"Ât#BÆ<‘#cBTÞL)O³:{(ZûÊ$mâ÷Ýkb{õÙûáâ¿ï}À)AÙæÎ)ˆ1‰ä ð› #DPá§X'p„ „.…¤ÖEnY”.TÑKVÅP£\u -…0ÜFF*Êû6Ôkuê9ËÓS"Ò"o«Úÿ^”þzû©-4…"ÄéÏ«¦ O]i¿¼ ¤kUD±÷œ½oý–È1…×ë ßx]D¢çÁFù€hÄU`ÕÈáE4JÜ׳A‘#k‚‚t2Ž”¡>z÷Ñ0«ýEÔµúËêᶨã"Ú.¦ZÕ¹-šÝY=Ù½8-Ìv£i'ïóJ4Ò‚ŽË+…ÁBU")Eœáû»övÙìÎì0»ý™íÚ}S-ÊÖ¥–²´­ü•Ñð󎸀Àéú+~‹1ëùÒ92z³ÇÕªShÛ‰¿Ëê:ûäo]!Á,y¬‹Yž-óÕ2k‹¹_Ë«²i³²m‚|Ö¬Wª ²}¿­‘ ºØãª]+*î¦TXi¾(@ã¾=9Êq¸lxŽ“÷Š%âF^5HE ŸÌ¦ž2•æ»+t˜áþ -í~òÛi=¾hÿËUí¦­çTÀÞTŸìnœ*§Æ Oõ8y—ja8Œy12ÕÐ’!ÂÀŒfÄG|^ÀÀß•çV{óY}êDœZWeÖ.ªLæY›ù;ÿÝK‘îÉòéÎFY†Aσ³<@þDd.™c¦ôUѮ겎og@#…M2ƒ+fA¼¬Êpt‰ložÈaÉŒÛrP›“¢ˆªéŒ`l¡mÆ ×±5Œ¶žbbÐê ócçÀžQ)fŸç‘ œ In ÒŒ…ɸ¤¯‚5RžÅ(€^EYW}F‡™"ÎbT)¤9‹>Ö‡UóËZl?‡e°ÈÙV3{øûøõY~‹žÎ¸PÐ{[ T÷pÍ@Rl€ ^øM±¨ -º9Jô+"PhBt1FŸ&Ê‘s«²YÜ—E(È|ªÒ÷Y݇qàsàâ9ƉP]û·Má´lz½ÐÐZäx/vxbCÁ6êaBSœæ;âª5ÿ,Ñ€>½Ö6×Ge,”–Âó÷áU5Ô«ãõ¼ú‹U™ÄKuñaµ¨}vMtX [LðVû€™þ㇪qsþÔã“}ÍM¬¸Åk„ÆÁê$hƒ‹<_ŽM:üäºFÈþv×é CØqb Kwsu¹Mœbø&Z­qˆ˜cC#ÜŽŸM¯~õût‹AÝGéhm38³(®¾EÉô;=ŽwÀŸq ÚåYJÆžz˜ h´÷GFÿ¯%£{§G#.Çt8•5RÞW€­èY(JÁâÂAQ´Ú_F]«ç¡(Ow/Î ˆK5œ)ïóJ$DŸ…¢d#‚ÅQå@»ý™íÚýJQv ôä(Ç⌠ç­FÊûÅÎfâ,%Ãк9Ž¢h¸¿B»†?Eyº»qª0 #9œ¼)ïRM AOÎBQR#œàaŠr ÕÞ> endobj -631 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 391.388 111.003 402.267] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000004) >> ->> endobj -635 0 obj << -/D [633 0 R /XYZ 72 686.127 null] ->> endobj -636 0 obj << -/D [633 0 R /XYZ 72 667.868 null] ->> endobj -388 0 obj << -/D [633 0 R /XYZ 72 531.928 null] ->> endobj -170 0 obj << -/D [633 0 R /XYZ 72 517.357 null] ->> endobj -637 0 obj << -/D [633 0 R /XYZ 72 365.534 null] ->> endobj -386 0 obj << -/D [633 0 R /XYZ 72 229.594 null] ->> endobj -174 0 obj << -/D [633 0 R /XYZ 72 215.024 null] ->> endobj -632 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -642 0 obj << -/Length 2018 -/Filter /FlateDecode ->> -stream -xÚåZKsÛF ¾ûWð(M£Í¾‡t¦McO;m’Ú¾%iF¦([­D:$•Lþ}±J\™’%Ò>tzÚ%¹ `,ðNnœ\œa„a*Áˆ)É%ŒRhM’>ïùtyqöóõÙËsxe‘T&×óDÑDjƒáÉõ,ù0ˆŽ'TàÑíüó×1Á£,­?¯ÖKtç_Ÿ/–™Ÿ]fó¬=Êò4ºþí ’-ù0a2¢"¢öæúìË)NˆW Cu’®Î>|ÂÉ Þÿfé|s«V —ÆeruöçV¨pTØ©‚B„i+„ Œy"%FÆ¥¼S>š–ÓUVÛ#“QŸ÷ ‹Ý¯Î#„Sÿ¡ó€P‚²Í™žr?"Æ$’3$@ hÀj‚Œ„Sœb-Å&v´"`Z§¹e–;UE‡&¸Š¾L¹j3 -a˜FLÏòÛ:øk1÷c6MÃðja½º(ýó"÷ãÍ÷:«ÐxÂÀéÿXWuxë\ûå9!m®’ Šˆçøýè—D‚)¤¸n¼ò´ˆD•!@ ŒòÚˆ½À’‘ýhÐvïCÌ*Eô! -ÌÉ8R†zí}=èDý¸v;Q›ëÛõê&+c'ÚuªX—©ušýV=Y¼Ø,ÌF£f¶ßÙUhŠŒ~äpý4%ûíJ"T%’RÄ™ñ¾×7Ëj¯e{òí¶l›ïûb‘×δ”êÂŒ†{Î[ÛäN›[ücÖqÓ9H¹Yã|Õ´áÄϦe9ýî§Î‘ —Ü—Ù$.ÓõrZg3ÿ--òªžæuöO«æKHÖw»y È ŠÝ¯ë†P6Saå¥é"ŠÎA“‰°‰“'ço!V¾Ë—@‰1HãËl•9öö©Sà˜é#ôAš5¯ß½½ºî Ä¨Mü§PúÛËõƒˆìéíXß-‚ÜA5~šÙ‰­A“/`*ñèÛ]æßê†à+?|Äã°ˆ„‘"„à=ð -ò>óKý™Üt1XÀ*•»#MÂmvB{‹i=Ê›h¢½ÐvÜ*Ü>¹4¤õvKcäÖŽÆÈ0í2ò„ƒC\7ûcòkïMngYfÕ}‘‡gwc{¡(·‹|ºl’¥—¦{ܬ;ž~™£8f·+­zÇÁû}T›Œ‘,8B”„xT•cpÒt ìǸ3FŒ -ÖÊp÷>6VþɹÆ&ϵ<à ©O76lç¬?¸ß›ZhDÕP8 ™ßª°¢–!ÚÎ2À•{íÜk·Û\· ¯eS+ -ÜëzQü;›ÖS?ó‘GŠÑ!+Ÿ,ll%ØŽu#Ÿ¼ýÄòOP&Q^—Y½.óîšoWÿ)l ‚‚|pÜö¼ÈC}ñÞa Op[+"ž³¢‹%2íVgª ï(3½/-Ö/fœDÜ-ÎÙH*æ\U™·¯…$Ó¥wµ‡GªÝº\"äyð|áÅ,À!ÉDu"ÖÅÚ¶‹e඼YµÎ«ÅmžOLÇjt7-»´FŒ⼈¿BToøÛªÀö–U§á-"ï/ÅI¬&ÔF[˜)àœ=j5êY”1áÄ@ Q1 -kÇ®:b-‚UÛ1j'6M$Fš‘d±ñ€.έ›5`Ÿ%ÎßÓÆ°š!I‚u`tidm­Ò2wÕËö&{˜Q³uZ‡º„J¤vPÒ@å—"³ „Ó‘MJœª4ÓŠ TÆ‚/p ‚ÎiYTAŠÐ?â›ÂÞ9ÐÄ›º ^4èØî Ø ->»Âasº)ôü×*«cjqµÿî7Œ^ÄÌ/nÄ¢^,_æIP#ßAñŽ¸iD…’b]ƒ¬¡ÝõzšûÏ7ák¨àÍÜÙ&Y9­Öeøž³E~>äð”ùy8ªµ/ùóužœŸÊìËzQz뚨KLV{…™îZ”ƒ×¸ü~jmn¹Ñ·(ÐXY-mÐo†šÜ怚¼B«Œ¶ØÁæÛ w“ˋݦ<”`TA"Üà«1×j? -„p›w6ÅõÕÕHT; úC@žÑà?_TÓR}Ö8ƒ‹/ |ôEƒ÷;ÈÏ°x¤ztœaH\=ÞïdzïG<ÿ“ýï“•»ì©ú»Ð°ýÎ…¨a5[n€S™Â°#à=¹vzQÄõiোÙ…Š4îßø¸ßÛUÛ_)6~BœjYë¸xO¾Ý–móýŸ6À÷8èÉZŽ ¶sÑ¿]5p¿wP©¡€3OÒ™„òêjy\g²'ãnm3~žÎäéâƦ‚íý3Ì ÝÞÌö÷.ž¤+I…A‚Ñ#º’=¹vÛ¸Íõ9º’§ ÛHxÈÛÛƧï?±/I¡*×” ëKÒÇû’Ķ$“ÌÀía­¿ ¹ždgÒþ&àDÍáì‹æZd-öĶZ¤q´8l<Ô†´^ ÈÓ°å -€˜ˆÙ®,ü ÿ…¢ºù/Ì.!á((‘üj·£„£jË;ÃB°ûÕ^ƒ¹íyM›PÖ\‡y¨œCÔ›7¸k‡ÙÖÈͲHÿÙö^Vëe½¸_.ÒÖej þ¦7…{6}P‡7í«ùÀwÔäèqEDÿû.Óð -endstream -endobj -641 0 obj << -/Type /Page -/Contents 642 0 R -/Resources 640 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 638 0 R ] ->> endobj -638 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 355.522 111.003 366.402] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000002) >> ->> endobj -643 0 obj << -/D [641 0 R /XYZ 72 686.127 null] ->> endobj -644 0 obj << -/D [641 0 R /XYZ 72 667.868 null] ->> endobj -372 0 obj << -/D [641 0 R /XYZ 72 496.062 null] ->> endobj -178 0 obj << -/D [641 0 R /XYZ 72 481.492 null] ->> endobj -645 0 obj << -/D [641 0 R /XYZ 72 329.669 null] ->> endobj -479 0 obj << -/D [641 0 R /XYZ 72 193.729 null] ->> endobj -182 0 obj << -/D [641 0 R /XYZ 72 188 null] ->> endobj -640 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -652 0 obj << -/Length 1944 -/Filter /FlateDecode ->> -stream -xÚíZKsÛ6¾ûWðHÍD㇧Î$Óδ®oIš¡$È攢’Jšfüß»xI„L)’lO›™ž€À»ûa÷[JQž\'Ø<^aÓ4O„a†™™€§àJ‘¤13‡_]¾:{quöü†r” *’«y"i"TŽ$É’«Yò6刎ƔãôzþáÓˆàTO»‹U…nÜðEYi׺ÔsÝŒˆJu=Õ£÷Wox¶äí˜Qœ“”ŠHÚOWgÏ4qBÜq9Ê©J¦‹³·ïq2ƒñ7F^®’ÏvÖ"É„‚g•ü~öÛŽÌg Àó„”sNƒ¸BDx \¬êiW.ë6ÖÉ?Á|²g>"PÆT2¦ Á€w”òh-hÆ1N˺óÃFc ÛpªoL΃É?´­Þ–c¦½ÃY¶Séú™k­ê¶¼®õÌõ¦7Ec?¿ÏöΫ(8wTŒ™›i•¡\‘0çzÞM*¿Ç§Å鲜 HÎR˜ ˜†9m3ý¶X&Àô±3Ýv`"²Ã}’% -oÏÁoœ#ÁX2& #óxuaLLýF,¼IéÌ—£Œ’Ĩš»¹¸Y‘TŽ2™'ãÞ,eätï.×'wåmõÅõ&þ9ìuEÝ¡Hƒ-•Ç™D<£ppp('Œ¼Â8äÓ_>°2; -$ß úȉè“HdüôEè{tÔ Ž¤ÿ&êÈñ¨cO‡:¦"ò?‰:oœëZÅím3Êxº¼mÊ¢ÓA^c¨I Yú˜Òý0í;äðHYÖe· °èt­cÐK©®DFïáp èáðÔ*‹ªüÛ[œÑñäK0p–÷PÓƒÞ“óàè=ˆâ@Á-)ÎÓýx Ò=vXÜ: “â X[¶0lùðˆP#_À5Áò´8vÐ2C"ÏŸŒÅ1 -Rxö}D4ª¬w†²¨^Ù.VÆ‚•àT"J®K6Ç"0ûRwThÆTA¯6å­©fö] A C,ËÃÝït37§*¦æ”J¦ÝÒ=çëÚÈu­  n@èËOªåôOo1òV*§…=Ž+íSÄ®",à*¨ªLôã)°C‚ðÈW‘)HðãÞ,ë+4ƒ£Ó«›² ç´ò:Í´éÕÚ¿ênt8ÔNõ›åª+ý -‘®Zkg§œÉð987¡ÔxL¸“8Q­¿ù—?¾~é¡'&À¬ÊÊߢö ÝíªY[¸ -‡@ßGõ¨%­GÅrºZèº+îáb`ƒ(±ò׸s‘ „_ϭĨh'â §0"@w÷Tî–U¾®ÝCµÞ‹„ #@ƒ„‘ÌÛ×\Å=!õ›ù{BºÊØÖ® ƒxàªViƒ^€ëB(1¡3YLJ6üí¤xÀÎ:üõ¢*ÈŸŽd:Xp8#÷k´½FäÀ ²:88Ã*L…˜í ¨pXEóöe›ŒaÐ>Ý¡¹’O³«I#CzòFÎVšÙf ŒpÄ0‰ñ¿'fó‘ëÄŠƒ^<=4Ç„ÙÊkÖYTH™DB ¥>c¾\ÚÐ&EZ˜ߣ#ÄÖŒÒCtƒ:‘ŽÐ7•Iƒš00qÜãÜŸéó¶¡1œRø¸]¿ošâK»5éÜM*ÛHF[Ö×61À+“tå§ëJ›Xé:6_É}ùŠ ȹ<Ñ0¯¤“óÂï3ÑÎYåˆ]òŠO?0mLh’‹0M¹•]ú¸-Cí]çsSZŒÈ^n·§Pý¤ýqU62½môxZTÓUUl¦,ç‘I¡dèOZ´aÀºÇ*ˆ½fÞ†!ÙÃÒÔÉ&ý’FÏ‘ …>°¢.4ýzþã»gn'h“;ØÛv@€¤_1 o2ƒã7³çwNJ˜²%ôÚï–3Çwî wþÍϺv‚74Z.| …¡ÛÐlKHlYö­åôn²g<¦Ûxz3 Üfá) ô?ß~›ìÛ¬zS[Ý…h¨ˆ®‹I¥·Ù -°Y¸Å~®cQßA~F·[]¹Ðèp&2ÆpÇ„¡[('Êiü«ÉES,Œ†#BÒáÏ÷Ãò·ßnÿä Q•íýÉAÄí‡uG#s="P;ÑŒ 5{D`ÏûD*š>yâ[QTürÍFØÐnˆL§íÿ@Â%ÂÐŒö„kpÝù”lÔHye’]§mHÎòËq·"Ö‰g 1¸ G+»2ðAv? -[ï @2¥ìƒ°%3乄2ŠpÓ͇£Ýh8mÛa8ô·ýuik®m'ö¾8¹Tᥟ‚Ö_|–èUÚþM:çû€q´~±ga9—òtdXmë«Ô%PDï?÷e¬¬>níbbc$9íÏÿNhSu -endstream -endobj -651 0 obj << -/Type /Page -/Contents 652 0 R -/Resources 650 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 639 0 R 646 0 R 647 0 R 648 0 R 649 0 R ] ->> endobj -639 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 632.346 178.281 643.25] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -646 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 604.451 180.293 615.355] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -647 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 576.556 161.125 587.459] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) >> ->> endobj -648 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 548.66 186.39 559.564] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) >> ->> endobj -649 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 520.765 190.804 531.669] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) >> ->> endobj -653 0 obj << -/D [651 0 R /XYZ 72 686.127 null] ->> endobj -654 0 obj << -/D [651 0 R /XYZ 72 651.32 null] ->> endobj -186 0 obj << -/D [651 0 R /XYZ 72 492.57 null] ->> endobj -190 0 obj << -/D [651 0 R /XYZ 72 423.813 null] ->> endobj -383 0 obj << -/D [651 0 R /XYZ 72 397.349 null] ->> endobj -194 0 obj << -/D [651 0 R /XYZ 72 397.349 null] ->> endobj -655 0 obj << -/D [651 0 R /XYZ 72 265.439 null] ->> endobj -371 0 obj << -/D [651 0 R /XYZ 72 139.795 null] ->> endobj -198 0 obj << -/D [651 0 R /XYZ 72 125.224 null] ->> endobj -650 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F14 318 0 R /F73 498 0 R /F43 499 0 R /F13 312 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -659 0 obj << -/Length 1894 -/Filter /FlateDecode ->> -stream -xÚíZKoÛF¾ëWðHÑfßC‰S Z u¢@’”DÙh:!)§iàÿÞYîR⪫Wã |à’ÜyìÎÇٙψŠè:Âör1Âvh¯3ÂÏòÔ.ÓEZŽ‰ŽÓb–Žß]½:Ò·èÍ„QlHLU íÇ«ÑÇ!ŽˆsW Cu4»½y‡£9<eõ}jfÝF\j¸æѯ£_F8ؾf„ÙØ¡‘ë °ã ÁÇYQÃj©†íhœ -œ!T!AH#Ï@~À#ŠŒ6+Ÿþéa‰Ð‘{Øù›\!w -›#Î6¬ÞŽ‰ˆ—ya)Çú$†%¨0*4œŒ ‰ïÿt»ý <žp!›€/OÏUµL †EN4O‹'nRhF#IL;iYTÙu‘ÎÙXÅ7Ié¤ûk)ð sÒJ½Å˜õØW€&Öι^ÔSû¥ä}NPÞ욟z?¦<¾Ëæ=vÁ[MÍvi;§*Çdz-K×ÊœÒêjµó´ªûÖIcE‚1dÕ™=aŒÂ¾ÈhûøqRç6îÔ»É"‰ŒbÚk‡¼1¨tsÿp³­i©@÷z–niÒÕ½6|Rw¥»‡œVgòÏîn꯳»¢ª“¢FV=x'‘`OˆB’z ¾¸K+˜¬$@.bÀmA§´q[ »-Û"tlnÃ=¸=&që9<˜ºËîræ}út“–iÇK¸󎀈“Õû²L>W“Îܤ¬ -tTYqݤxX¡iyz›6©RÙOÖ]·ï “H‡m O˜V°Togšº`q*¢Ú…—XV©÷qÑnáå³—/¤ª¸L§öZfíBVð!)ë,ÉÝͧ2«S'±X³:”4^èøÜß»‰eúq™•*þP¦“Y’Ï–y²žr·¶”ÑIgó” D8i4áiˆÃ•M¿4;Ýd…^÷ô ¹§6?å6g-¬¨ƒ ¿œ}Áøታc²ƒ˜¶·ÙåBÔ×SNE;eCéŒ)Þ®gœ—þÍOiáÛPt—-Û¬7k?àªö¯¯H’¼ÍðpSß¹+£ÏQX4Ç™­EšÁåÅfIíÁ®•3xÙÄ´)tª E½¹Ûão•ñŸýöûFmÔ-G6’è„3åy÷ ~m³wR&·imë-÷{Ño`óíf1å Ô~t°˜R ÊVçù)å1&âÆ ! :˜íß)) ê'0è˜!Âùª.è©cX‡ "M„B†QÀïuí‹åæ[ï9{š Ùœ:uÚ$¨~ÞÎÁ¢‡Áµÿª‚hZq6,>ˆ†#å4”˜‡jOàFʬ«´|;³Ú ‡®Õ×wPÀ¦åf '6ò>ÊM~àÒ=7Úø·©½òñÉßJy0 ábïå…qqŒÅá¸8NÞáBq¤ÅÑI¶†\ih|ÔªŠfpìnGÆAvûѵۋŒÕá6Oꤋ)â“æ‰}†¤%ZÃá8y ”Çá jwCJ„5 û›~0fµ ]«½h°®dE[;~T콺0¬ N‡Å‡a±¿|ÑÓCò@ÿéS˜âm]W/Ëb§’ºd… Ô¡ÚPêıÏÕIU=ñ‰¸¾i#¸°|@’¹óf¸äƒÖRAsÝ Lw9(æ9¨Uû¾ˆb $¡¯‚õé#‰(@§*¢‡©(V)9‰UûMÐèv& -¢iàÃ9…]ÈD ¶gën4Ç]rç‘i¨¤×8‚Lý÷Æwæ¢Nîݘâ;óRñþfy)ŸjJØÆu!˜gEÚUVVpb|g°¾3X߬ÿ'ƒ5XP`¦M`¢¿…D…A„^ö)ßt”çiØI($Ør$Úþ}ˆB:Ðho3}T -iÿU…Ñqeøáh8NÞ¡ÊaÉÌqh඘†Q¶ÿ£ÜŠ…ÃLöc¡kòëHþ¾­>–•·A ?wé-«Õ´ù¢öÞ› ÎÔQâO°p"î‰B^ÖŠîÆ=h¸U]ÃJ>í¿ª0  n›Ýƒqœ¼C´ †Ñ“°O”0$Ú“z}:Ðj?ºV¿ öiÿÕ…aqÅØá°Ø_~‡Ÿi&¬Këð½i¢0ÂÃÿdÛ•Ö ü¦uNaÕÑ:Ñ¥uNa×Ó:á¬ÈêMZg€‰Óý™Ìì1™–Õ¯ú¸HLîLvP xÖ:$;^Â6AÛ˜ý•öÔö,¬<m]º½e&ÊJvi™U/—0D–4¹¨é¡-|¸n¯â¬-†š¾–¯<‡áºëÓxÝ@º1mÇ®ëÓ4^¿sÝ#Û)zHgLñv=¾{=Þ3ï¡ïÃçînêm)f:ŠÙ›õ0§Ô!†~g I -IMvþ¥Wó7 šÅh -endstream -endobj -658 0 obj << -/Type /Page -/Contents 659 0 R -/Resources 657 0 R -/MediaBox [0 0 612 792] -/Parent 663 0 R -/Annots [ 656 0 R ] ->> endobj -656 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 549.72 111.003 560.599] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000021) >> ->> endobj -660 0 obj << -/D [658 0 R /XYZ 72 686.127 null] ->> endobj -661 0 obj << -/D [658 0 R /XYZ 72 523.866 null] ->> endobj -385 0 obj << -/D [658 0 R /XYZ 72 398.222 null] ->> endobj -202 0 obj << -/D [658 0 R /XYZ 72 383.652 null] ->> endobj -662 0 obj << -/D [658 0 R /XYZ 72 271.302 null] ->> endobj -370 0 obj << -/D [658 0 R /XYZ 72 201.636 null] ->> endobj -206 0 obj << -/D [658 0 R /XYZ 72 187.437 null] ->> endobj -657 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F76 529 0 R /F14 318 0 R /F47 238 0 R /F13 312 0 R /F73 498 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -667 0 obj << -/Length 1543 -/Filter /FlateDecode ->> -stream -xÚ½YKoÛF¾ëWðHÑvßC Z u|KR€’V6™rH*Fø¿göA‰T(%¢ÜB‡åcwæÛ™oçAáä.ÁÉõ#ÌS FLI.a”Bk’TðúÀ«›ëÉëÛÉoWðÈ #©Ln—‰¢‰Ô)“ÛEò!ˆeS*pÚ|}´5º7WÅʆ«»´UFtj˹Í>ݾà³%\hx ï‚~ª{BßÜN>O\ℬª“ùÃäÃ'œ,àù['ÖèäÉÏzH¸Ô0®’÷“vض©p—nˆÖ¦k ‚0扔-ò.£<Í«üÁ6nç$­ûÛ>ªbÿíûÂÛþØ~” l»§—\ˆ1‰ä 0Ã0› #Dá §XÇp„S¤ˆRˆ€ƒ½áæÞN½*ÅX\u5 -…0\öT^¬ËºÉË&pµ(7 ú…õŒò0ú¶wbäx×µkcÍzÓüÄ'é{€¹ã~†O_ÿÓDˆŒÛhLá'²)ÁØñÙ›jpÏ€o¨B‚¿\󣤦Èh³…ô#Â0=_ì¼P GÃÑ{ •#ÎúJ2"ÒÍ ¥@ëÑ+5ÌW=½umƒ™?b³)Ò[`ÀÑéæN0ˆl3×Ê–¯Â¤¾LÛ9›².îJ»òç™Jïó*,‚ ¾[är"'íª³õ -HÄÚ9îÄf§«! ”ƒ½¶)ö‹Khëb1 ÀjjNÑ[WÅéüÀε2/©ukÇ…­›¡}ÄøNŽ ½L½¦ŒÁÑÿMÁ< häW]_9¯Óˆ’%ÅtULÂ$‘(ÿ†Y=©i©@ön–ö@|@ûâ Gi]…û‡Íª)W_ÃÝ,Žó˜Ä|àti`ô”( R”y¹¶5LV2ÍÝ ŽÀqJ=ly¶ °e6èèÁ†{€‘´Efaø= ÓÓ½­l% 墳@@UÕ¾¯ªük½7é"L*ꞌº(ï|‚€W@jWqº]Ùë#¤r6Œ‡íÂ$ä8ùã ƒ²)Ó -¶õÌlp§2$o…¬N}m#Æek›?þ¼”îR¥•¹#´)Úl ð˜WM‘¯ÂÍSU46¬XnÊySK< -^Åû0±²Ÿ7Eø¡ÒÇÊNçùj¾Yå»)ëeϤŒN;ÆS€àá¼}àÝã7ˆû;›åqk4 ²É–½áé -O}Aá\qÑÒŠºÐôÛÅ7ŒŸ_MpMv×€Óö!·]ðúnêò9ˆh§ì‰"kŠËYâç€ò9¾ùË–A°sÅÀ¶ëjÞà:Öš³X³ä«6À»jFF_£½¦Áå1×ù‹›ëý¶ º|®UPxã}êÛ®áîcµÜå=ÝFÂ÷ïßpDöšµn²F§P^ÍõÐ\põ?´Aœ»‚V®ÄÎ\ï‹iUæì¼b,†½,l[¬¤Gꬤ»:ÀwMìÝýaH>>Dú´ÓXI zøûD>Vå§oªïKhH4ߟ¹>pÁ%[m^¤±âP8@”ý•Æj¤Úa:tÕ¾[Ck«}/N}ˆï¦›:Z´Ñ½Ž,‰ñß­Štº8ÆŒ“÷×÷,,?^î'ÆYË/°@ŒÉ³c„ûF 2”nËh¦Ž|1©x˜]ŃÌØæ·EÞä]~H‘¾h¤8yW}‡ÂrrƘ3×{F0ãR-=“pTÁÌH$¤é·8ƒt©u=­ƒtpPŠ²­ÿ{Zœ¾»ž[Ýr¥ÙhZŒXâ÷eý½¦­íšMUþRY²ÂjQ÷É<`ƒu^ׯb$nî[.Ý'¼g æ#®ó•Ô}tHSf5¬óo€ÿö´û;€êö︺±ËL¥Ðçíÿ°‡<Ô³†Å|ti]ëVÚ˜F\JYäU$ÉS±hk— õ zOå3¨qÛzpCÁ_Ú,Ð~s¹´õ¼*=—‚·óU` Þ¥.`‚HNýã;Xú×4 -endstream -endobj -666 0 obj << -/Type /Page -/Contents 667 0 R -/Resources 665 0 R -/MediaBox [0 0 612 792] -/Parent 663 0 R -/Annots [ 664 0 R ] ->> endobj -664 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.205 111.003 491.084] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000020) >> ->> endobj -668 0 obj << -/D [666 0 R /XYZ 72 686.127 null] ->> endobj -669 0 obj << -/D [666 0 R /XYZ 72 667.868 null] ->> endobj -369 0 obj << -/D [666 0 R /XYZ 72 620.844 null] ->> endobj -210 0 obj << -/D [666 0 R /XYZ 72 606.274 null] ->> endobj -670 0 obj << -/D [666 0 R /XYZ 72 454.352 null] ->> endobj -480 0 obj << -/D [666 0 R /XYZ 72 328.708 null] ->> endobj -214 0 obj << -/D [666 0 R /XYZ 72 322.979 null] ->> endobj -218 0 obj << -/D [666 0 R /XYZ 72 256.871 null] ->> endobj -665 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -672 0 obj -[228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638] -endobj -673 0 obj -[833.3] -endobj -674 0 obj -[500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] -endobj -675 0 obj -[277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] -endobj -676 0 obj -[1444.5] -endobj -677 0 obj -[339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3] -endobj -678 0 obj -[777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] -endobj -679 0 obj -[569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877] -endobj -680 0 obj -[777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5] -endobj -681 0 obj -[769.8] -endobj -682 0 obj -[273 273 319 479 228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638 456 456] -endobj -683 0 obj -[556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667] -endobj -684 0 obj -[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] -endobj -685 0 obj -[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760] -endobj -686 0 obj -[250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] -endobj -687 0 obj -[278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389] -endobj -688 0 obj -[333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 0 0 0 278 556 500 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 500 500 350 556 1000 333 1000 556 333 944 0 0 667 0 333 556 556 556 556 280 556 333 737 370 556 584 333 737] -endobj -689 0 obj << -/Length1 757 -/Length2 1108 -/Length3 0 -/Length 1645 -/Filter /FlateDecode ->> -stream -xÚ­’iTWÇ¥‚…àEñ"1bYªPÃö°)R[CfBF“™ K¡ -ZD°PR* †‚ UTR¡ÄQT”Vƒq­ ²iT¡Öö”~í™/sïý¿{eX¤-Ââ`†â¶4;š;ðñ¡9šƒÉÚÚ[sqC}¸8ìhnnt˜(tG@§¹Óéî W’5ðÆÄ2 /ÀÕ{Õ”È0E°áqQÂÅ°ˆèÁã -A$ÆC`\f˜B!ˆ˜:!°–$Á‰FÂÃA $û)¤”—wi(Qü¾”K¤ NQ®#„¡B€`>ÉžÃ`åÿ šÙœ•(²¹¢©öÓ>ý§Î!BÙ_ -L$NÄa Á X‚ΔFÃïàB`Iͬà\!Âc¢ñB8¼K!R’CaÎ>W(…§ó0 -Í„ œ›F°ç„Fú®þk§ÓÅ0.‚âëeâ¿ÛN©§cÚ?1áI±„¿4BH|ïÿ6Îæ‹ò0AãÝÉp%®ŒD¼"r©4€ œà‚ØÞÅpâ LÙø˜„4µQWW`/M‰¦_„HÅB®lJAú¼°”T[:ØÒÝœ‰ 'pq¡oû—’—(‘À(>ýbgÞÇ|„ð†S`é—›oMÖæ’SÙÊt_EWžŽW|C»¾åúO†™½…:ªŽ ›¾ã1ãµ¥&óô–%¿1—înJ ïd½ØžP ï™HÚ4PºõGó˜‘ÒY¿xùï™O4žº1öÌI'ôZß%e§ò\ÙÐù§è>ë}xÇrVklÒ‰Öﲜ]bX¥Â 9;S-#Œä Ê\FŽ&Ù¨hŸ®æjfúæ}õêÛÃXSâGã -ý_O|öRÝq¾ºùd×ò¤~ãÉ£6÷ÌŒú>ÄVЖu¥©Ú¬F7åfX4×TïË¥s²ßþP{·=?hÝ#ù.ËžðgúñO;|Z¢¢‡îz¦:è~?zÏ1É™hò}½«ýŽ¨¥.:½à½®/ýG2¨Ã­Ž'²–7ßÈv;ÔÀÖydt?ðÛQ?í˜[ð[u2 ݥˎxÒ̉½-•å­®]Àg/M#{,Þu6cö=2¯çñ]Ýq•Ÿ“ÅŽ­,P‰| EvãÕUÕujeÊZ«Ï[ŸXFQÌ÷ÖÓv$øöÑbÑÖúÞS©ŽV¿sŸŒ±j´ Þ2ÇÖœº,ŒÙ% Uëe&õ¾8ÍÉ RÐòb/Fel×rÌ[ºWrlL2Fu¸³ÌÔ*ÖÔ¿ÉÀ"7ß'Gö[]>èï¿rÉCUÛž¼¦½õTMO=óh)_‡J>íXò•Üß÷ælL׃¦·™óÓ ~¸-ߺ…×Àr}Saù}žÀ¯œ¼sy”øÖ~M¿Ê0ù¥²¨CløÅ‚á×ç=ßj­¶; –63ù1-?©-n!¹FQÜù‚ ]¸Ô‘üÁ””|{år{ÍFë(%ø:ÉsGqnþgæ4·NŸýtp°sr«ßá|¤7¸<šbÚªBA_Ì›÷x}·"°ovŽÀ`EoOƒç».÷$ípô†Æ·ÏŒ¯P[/™mìó¥†bÐ>ÿ›îÚì%û8x¾üUÂRö -2¥¼gÙ(•Á‚Ü_ï¹oj|Û~£guú#Ƶæ›V¯¥Y†{ê,>^KákBº[Û]C 6§ÖtŽ1IGU•<Œì-ç2æ¹›¼Z4é 5­8´2»Ýõç5G·PW¼Ç“ ®ùÚo¡ÝÀε.çZ­Ÿ+óˆz*¸öÓ\’wD°Ç­>²ƒxµl¶mùÑ„(*^g´¾?('A÷à6ú^Å©áT¿¯½ÆÎá‘·dý…tõîÊx1sÛ¹W—#5Èγa+lM›­CìF´Úžˆ£ WFf3Ï  ·èÓûåríܕ姱ŵo–åë™ )û«'oOιé·V&7xùëÕZ1Ë"_ÿØÏׯ“]Z>óêÞz©µH]6gÍ~ûžS”cÎwŸtŠÃMc.n­BÖ*†§å1öoŽmh+63¬Úaר&¯¼_Š<0-½hÂ.{9+•þøjåÙ¨ÓÃú1¥09dLílTi~uâ¾qõxÐøóð’¶g*bqüîtäOø& -endstream -endobj -690 0 obj << -/Type /FontDescriptor -/FontName /YQJSDJ+CMEX10 -/Flags 4 -/FontBBox [-24 -2960 1454 772] -/Ascent 40 -/CapHeight 0 -/Descent -600 -/ItalicAngle 0 -/StemV 47 -/XHeight 431 -/CharSet (/summationdisplay) -/FontFile 689 0 R ->> endobj -691 0 obj << -/Length1 811 -/Length2 1849 -/Length3 0 -/Length 2409 -/Filter /FlateDecode ->> -stream -xÚ­R{<ÓûWêȪS.…„ïÊrkls¹Ì-Ãrg¹fûŽeûN³isK’£”$&9,¤r)NÊ¥”tEIYr íI.©3:óúuþý½>ÿ|ÞÏó~žçýz?îî…ÄQ˜¡ #b#ÑúhsÀŽ@À£Q€äBÁ;HbÓ˜=‰ šh,ÖpæÐŒ!€2576476…!;f$E gÚv:‹$SÇY42 $v8Èô “耓LÙ<}G§ž‹Q€'²¢AŠ> (42ÃhÌ`Q¢2Óoa -'ò{*dEIDÚK2u‰H -¢ó -H…ìbJ¦-ÿY?6wäÐé»HŒÅöKNý'ObÐ輿LF$‡ ²“² ©~à7qBã0~ÌâÙ$:ŒƒÂè €D飌¾ÅiQŽ4.Hq§±Éá•D—â DùQ‰Ä¿%v¾;]<|ôþ^íRÒDƒØÞ¼H@ýË^Âè±Ä$  ôQ(´„(yßA? s€ÈL - -0Æ&‰Å"ñ`’#’ c  Ð -È@®D±>ÄdKJ‰3ñ•É‚-îÕÄ 0°_ -!3`àþ’¬Í€ô2Áa‹G)±õ{ ‘p—à-°µerc‘†‰1–HB™¦Æ¨øÿ!’9,±—ÎLbäwL¥I¼A.H†‰:™d‹ä=95)¥ Åíe+u¢6çžOn½yèJ®…þH¯…ü3VícoP}RîÜZùzþ˜ËE -Õ¸_¥'Œõ28Ô%'\«¨SxÚKfœ<øËòfÁýÛëù‡Å"¡ÈZ½ñ[?öEß\YéúmZ¤2vdEéóÎ… ûÛúE«OQ¶óaA‚ë®Ù ïŸ}çFw2‹™¢’f¥ÀÓ¾ˆTn÷tD¼\›‹M¤ÿȵü,‹ÒáRÚ`è¼ ±ëìe¾j³É3ß3¹€Ô&Kx.Ѫ¾Î…ðnÕàì )žïä‡÷™V-+”'—ªÒ-w–¨,«nû72¬ ¦_‡ª<’ä#ªÚ1–YèÈÚl„gÈìbRóØŠ© ùùÞO_ÓTÇɱp)åKËýôÌò¬£µõFtZQ*+Ÿ¦ -á»Iá'ÅlœµSïj›´ûŒGÖqõ3€ˆý#Q±óBêVöÆ|–‘sf;Á_ïr03Ð+…Ý}Ú1PôþíÝÆ´<Ì/Žv½! ÞÏõš+®Þ*¶W¨øuE°ÎѱX³n³kÐV n¥°ÙbÃz\à7ž.jêàfŒ†ßˆ“7ž›U+77Éïøl1ü˜ï#¬;o¢–°rø jDºþ¨·n¬Ù;é›.!¼v³ŠjaËF­ŠwÒ#'¢¼Ô¥4…Á›ÀÊf—a«Þ£¥ÏÄݘÂÕÝ£ -X@¥¶Ëþº:÷Á*&Øë3Üç‹BôY»­oC,hèÒll4¦Á-ØØ"0ìK‡Õyϳ%±Ç÷O<7R; 3_=Ð5ˆU‰tˆá'|MžîÚÉY-çP× ‚Äe¹=-ý4ìàÁgå8[-‰·Y5ªTÞz5cãÄÈQ½cQôÝzG– Ì!(õEŒ -EEq¨Ù–¦-Rî৔!a}dZŠ#qn¡º˜ïk0ÔesÅÎv)2‡¼¶ákèºRË{VÌ|à+}dÈêdzõL:Åúe¡»ÿtáœeß“9N¢Âƒ±#mÝ× TÂׯì%*koÓÂOÝE{„înmròùÇ£küZ&§üáŠfoš, -+ù¨)-í‘Ô~ãàâé{ÓR¶P«µœlWT(SIÜ‹ýüä$ç\IÞ3#M÷;NóøM —à•ˆÐƹâОÝ6õ¯ì•/xÿ>}½-ÛL™=/ëˆÁtØÌ{´LÌT~±½£7[)FSÄ,í}Ãò2y”ú ýÆ’y™Á‡ðÄœÊÓ fÕY¾ ª/Ö= ×çœÂõæ']².­ÜJÝ…¯büêsšN1Yac÷Τš?ÜÑÐáh½ÏÎã-èºe8¹nreÞeXÞ†××Â]Òb›60ðöìö˞Ĥ‘@í¬¨¬ñ)®>¯_À¸ãÀø© Õy̯^·a]’Ik 9y€£×@Êý“²î‘De,Ìþà¦Ý2¸ *ÍÄvûùܺèxA÷,'X vÖv®numt—i§f×;¯uíî¸&J3)] î¤EŒÏ›-]Eê]QÛûJ£`Á‰-ƒ÷rÈS¤Š’³E¿™%´ÿ|°§›S2\)Ää7-gY¿€ -o¿küN8°½a‡ê‰í£ÒÏ’ÖM]vT—⧚¤¨µ)ÐY ÕxÛ¹-•>猲Æ+8·U'⛟Œ¼–&Nßù(HH̉Òxœ¸1ób©1o c>óTµVjà®ÌÄp·ÝárN¯lõò[rëÏoqïk·jŸ|5ª*'[ôˆ»ÈýŠ=¡owÃÚ¨nÈî³Ïz.LF?:>¢!Ð#K)®Û(Ÿáþ!Û'x„ès=\ðZðw“$£½>Æ2*1üKmỦIÓ»”aÖ–­üÐ*Êzybø€ùç›WCÙY™Ó†;j½ë.Àw£6[CçYáîJâÇN¤7ïñ3RO›‘— ô¾>™×q:¯¡tÖ:€n4è?<µª&’ÞQ÷@ípÍKÍçoeôw!Tïï¿6p5vHµ;É݇žÞ‚²<1̉¿bÑúUV®ü“Æê˜2…NM=¾Úó7Ôl¤ð’øèEôÌÓQrF6®ØûÏtgu>½¯RÑžù~,&¡¯‡[ç§p.ݪÖmSf¯ï*y?Äb&芟²Ö‰©ÎRh¾®b® º»wa¦¸šÓ­úå§>x8Ø­út4tm¿ ù÷l|Kú4Ñí±áÛÂÑG;m›/ÏÊI5°E=FWc¡üš-w&*ø½²š>ç{© zð’™ -endstream -endobj -692 0 obj << -/Type /FontDescriptor -/FontName /CVGKQU+CMMI10 -/Flags 4 -/FontBBox [-32 -250 1048 750] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 72 -/XHeight 431 -/CharSet (/D/P/a/greater/x) -/FontFile 691 0 R ->> endobj -693 0 obj << -/Length1 792 -/Length2 1655 -/Length3 0 -/Length 2206 -/Filter /FlateDecode ->> -stream -xÚ­’y ]<ƒL¢D&9HÀœFœWvøΠÈ)Hy  @dà zC yÔ -’ Ë }/SüY?Z ÛO è¬b"1$…É ÐKåÀŸŠYþX?·ò§ÑHô•ñ+Aý£M¢C´Àÿ˜t–?d&d3~¶º‚ßÙ ò§ÿܵáhÙœáM=Œ!mø½ùYA\âqÈ>€‰æ®ÖAågq|«(K+7¼­åîï»Ús$A Α@ ÿ2¯jÌ_Zâh$ÅÏÕ‰ŸÎ²d™ˆá ècq‰Í&ʣţô±X @ -È@®…d09â-€8˜PÀ‹É–_¹U¬1€"3étÒJyµ‚Acô7‰PÔ¿I#å»*ÿùÍLn0ÐÓÇŠ0FÀ‹ýٟ͜՟JœÛ퉣A.H–ï2ɦÔ´ª¨â0ËÜŽ2?õŒÂˆ¶ÚÈŠ SääKS¥çìê§GÀá‘p*T¢˜:ewEñ©V™‡4Q‘/àͰ͈k™D¹iòäñ“’-9MõéÙ±£½¿¼aUïžîÓ ÔÊܶÇ]W:/]Ü#\œ ó=ód¨W!¢9’*"çž} -xtlðÒã¯ï1s™½ù-[gŠ6-õªÖtúöÃ2ŒãrR=ƃJúyBM“¬ÛÏi°k]*²”av¿æ¦u/èpãKþz'>³XT%-Q½]\ÆíT°;O?#µæ)ä]ÎB´n;~%æÒ£<þé1Ÿ¾ˆ˜ÒƒØ·•í†1ãÒÝ­\'BØ!ßù´íæId¥ÖpB c  ¨ l1ÿ©¬ÔDNþscÓÉ; 5žºg¹`éõ×oM<Ϊ«ëðÏŠ$%+Á¤Ù9Þl`šTîîë’€úñ°_lô´‹ÆsÌ’ƒm¡Ã`²fÔËÄ­3µÏ•Œü»…ÑÑù’Öät÷¹ðRàw|Z ½èp¹†4–„¦ÊDPnÆšÖàì{ÝQvȱÆXaf†è×àßt|×”ÛdБtlì؈Šû‘·4ëâ)uÇÏ øÁR|ãhò¦ƒíKxíÌŽ[B’ubs?.Ÿ¥¡æË'mÖvËqo¸=] lÛ|,H¶8y*bó½±; ÎóšÈ< Ò×…œÎ:J„üy„;™n? ! »Õûè¼a?¿Åü7Q{ôVNÓÚÎ8öÚéψ˜¸Í{F/;då3¥Ÿ™Ä–ÿaë—§#>bõëæù¤îªíÂ÷Úè—/©ÊieYZ 2»¶5ÎÙçDüöĉlW`½Àš;Ö -«³¨V]x6ˆ*ÿ:ëYãî&t§/º™})Ì´HмtµÒ8~’û©²(;³3ën«‹­<$§™¾<evÀQÃÔYŒsÙ8/$§ã;jó4bç=^ŒÝ^l~¨„è23UºtÀ>ðrü…˜´è'MYLÝ·fªß¬ –ÞÖ¸nµ>M½gïâù„Û0)(ò™‹ÒTzƒçt,¦NEJ¿L†Á[àòï -3»“¾ùJD¶½9m·È¼ÚrñÁ`áËÈ¢Ê#ÜÈÉóü¥GþÞDƼ&’}ªu rFÿ zUFÔ™ìß–ÿÎ".^Ã^øíàÕÚcjZÒª¶s5„“²c ØÑç6>O_äæü8ùpq!vVõßëy€…[çÍû#[à&í°’Q²¢Jâ5_‰Eµ¨ð}0eäðU†X¤ÞÕ ©¤œœôWðÈýc–PË+JÌ«ôÞf”yÊúÓž)«a¥'Åüô¸‹kv:ð 6õœ+é<̪T¼]·)ÁXm§õF¥pª -ˆÑïÏ>j1œéq¨ÇKVw×ïs»^h•§4j»¾D¦cK“ñ$—W]!NääV"ö±áµ7jûÆÌæâz`ÖrÍ:×5%_–L`f2c³Ô¸AŽâ«%AÂheù¶M5&"ʶ¾å68š¤ùåµwåò9O ¥\ý¯Ãùwڴܷ܃—®³cÌ4¤’tŠ&²¦7E‘¶ðê¶[4É]¹[”èîZ’´SÆfK{ϵ½ŸâÒ›…Ê'KÑzÙ¸=Ñ¡ÝŸ Ñ«ëq8O\Ï{]׈r5„§Ìg˜¼ÊÚú™Ú§€¼8KA4ëü0|.CV£‚H|°ñ«Qxô,¥8°ýÑùüJ[ëÀ[aWÛͲ†<_Çg· )æ…o-;¾šÈöíƒòn…¹,sÖʲúžË[iL„o¶W„¶•‰³p5q -¡ãAQ§Î-ÈÔ£©zï‘"¦YŠžŸ`šÎ ÍNU²£·æ¦o‡×¡ -3Î(z¤ïûQ™$B‘tOÝ®ÊÇŸû§7-Qˆ+ìXŠ›²•°›²HñÍo|ày7=Òc x(±!¯ëTQ]èÉîß½®¸ëîÎIËnu™í² lÎÞÿ|ïèãSY8ß5—z¸Û1˜®–ö…¬8†@/úïàVçí˜/1©NÉ6YC2ô©û¦Ýdÿêuý:½Ò–ÚþˆòÌÅ’³ÒCG«Ë+ÉÞÓÌ´úxÚ„©ndW¦eŠÍT‚½áûአk-‘¹Ì» -å±$þ(UåL¿;¼;4Q0Hãù–æöÁD§2,ÿçKg -endstream -endobj -694 0 obj << -/Type /FontDescriptor -/FontName /EFXCJE+CMMI7 -/Flags 4 -/FontBBox [0 -250 1171 750] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 81 -/XHeight 431 -/CharSet (/comma/i/j/k) -/FontFile 693 0 R ->> endobj -695 0 obj << -/Length1 778 -/Length2 1256 -/Length3 0 -/Length 1801 -/Filter /FlateDecode ->> -stream -xÚ­S{8”ù§"g²Œ[ÄQ¿Y±.k.®¹l2ƒÖe\FE$;f^¼v¼ï˜‹ÆµU³Š\ÆåT¬”JkQÖôh*Ž.›]´"¹Œ³i1r* —NgŸcÿ=Ïû>ïóû~¾Ÿß÷ûy?ßßÏ”líÎF£ /XSˆg@£3(d@!’ÉTœ©)10Šx03 89Ù/( -[`¯³½³½ ÎÐPnŽ‰sšÅ*ɸÇC<˜ÅD)ˆ…â±,&£,$;‡«;ø€ñ!^"Ä&â(À†YÅÀŽ´*ɉFã˜-ä~L%B<>& -˜¯É´˜H6Šp’ŠÆ‘üQ¬„iùÈZ_ÜKÈáø3ãW˯õ§43æ$ý‡€Æs…ˆè(â!ë©!Ðmtˆ ã×g½LÌrGb8 €`¾,‚Ø°€ ¢™>´†C{½̹5 $Ÿ>>Vfº– dˆ`_÷¿UWÉk1ås‡‹@8³—‚±çã*b]/O„…²a$ØØ;&ÇLÂa§‹ìA -ÀH„ &T€m˜'i åáVê@$(Aˆ ƒ×;'@Bèظ! øóR©¨(ÅÚÆž°Ö™LvNNiÿÃd y<¬#Ì®q4Œ™ A"ˆ…{Ú‡²\2㊛³.§{V=¾¢b©L¹™ïÿÃÞÛ[ŽœQæÔtû&X7„.Ö‰u4d*²GFüo%©A¼f2òK~Y‘%~%'·…ΉéIÜOߟÒlmþyþ•½rÀ“á\.ÚÈ[ÏíB%Î2K=…¹?+ü…ìºj­†¿§†¾jb¢¬µÑR¼óªd÷î”d—•Ú€ßz–â÷…7H:*o-fo®«(ÜÏùyVmçLHY¬Ró3çúÌ-nw™ór]¨‚!Õn‡ú<–—Ôˆv׳“äBøÜ·_ùtÂ…K~âÂß• -¾[‚BæG„ø½õý äU•ò­ë±Zš%ŽErU]ï çáÂM6ÉËUM°]M“Å–uRÕ󆥊w ·çÏþø²\Þ’Úv¯§È;·§à¤¡>¾™ ¥ýfRsp0;D7E÷¥*ß|rláïi9 ™ù4eOõ‰ÞôK¥ñSX9¯®'D3bp~ Hª×HÛn`­.¿V°íˆMXï™I¢•N>×ÑLŠ/UR51øöJ×ëQÛ)S—¡“¸½kâ´v«Fíº¡'m¶ k[Ðð=Ü»·›º—Y)Šñ×ß4áN6ÙQî5ö~ÓO`U*E|í•3½µm>“6Ù5±Þ™³û³¿Þ°3?ÇQ^x:ïW0ÛE¯Ølþ¤%Ã5ت™êJÓ~ÉÌâùEÝ -ÚzC!}^·+Àé,ƒTÎé;›³—ûõàB¬e`Ctñ°†Ö;ÿû_- åÚá:¡¿¶ Eãç-úËó|žº¿81=Ïn)Úˆ{ÞïZÞ6'ý©è Ž_ºÈFM:m³:ºy`kEÈÆÈÄ_€œ2ó¹Hzø¯Ö¨Y\A6÷9gj¸¼ºkn¬Á`®:c‰ÜzÔ³»M§a,¤M‡ø¼4ÊÃÁÀd§pk” N,zLxŒ½6¤m[AœqÇoöëõ¢o­ï=â íÇtCeÝ?äÓ©y®²Y¢ëcƒI?UŒïDK¯Ð6oìzQ•o†ÝÇìÏ^yá%H×ͼ8¹)Õÿöì9 ¹ú´rZRœ_K¨²¢dÜåLzDŒé7yóωëïñ¼—ÔŽ^Ò:Ö1瑩go]Û¨â3³ÜÄ1|÷&æ/Oúz+hÆ„¾«í3‘ƇÞtŒ&6Þn|¶á{Õ™h뢓V‚…°¼Î† s¯÷ œÊ¿us8ç“R¦âËѵŒ2”ðöð5ù r«/(å¦A®ÒˆY4Þnè&“þÖ:dÖÞIÒ.| 1¿óoLFaØ -endstream -endobj -696 0 obj << -/Type /FontDescriptor -/FontName /JVDJDJ+CMR10 -/Flags 4 -/FontBBox [-251 -250 1009 969] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/CharSet (/equal/one/plus) -/FontFile 695 0 R ->> endobj -697 0 obj << -/Length1 822 -/Length2 1824 -/Length3 0 -/Length 2389 -/Filter /FlateDecode ->> -stream -xÚ­R{·‰Ï4ÄZŽòkZ.ÆššyØf3%ÄUí0Öp•Í -.JÄ%Œ„ȦŸ_?Òៀ¸i0< Ýæm^ÊC\¹°zlþfgƒp™Ù:û¶+ÂMžX Eʨ,ýäJHÍ•Lí_Ἲpl²_Zº,¨91Œ¨¦¬ÔnWþÜúÜÃád -λ7h}oŽ7h2B´ÓË=P½ Z~*1z!ze@VÿÍôêsš»ÿÒ6uüè­E¿ oaŒ ªâEÛuEå±3ÛöŒÉ]Ú«œK*nYr3a uûj¸ñ²'ÚŤ¬Fïåw´Ëut‰¥]ÛýN|*¶XsEÌ‹!NðKËP -ï›GzcãFÿð˜UðAú%4}ŠúSêUlrG¬Š{û&ÛÇw—£p>¤k´©?¹ÝɦÝ&ÂNµ´æ…øÖé%âSûÅÆûÇ¥}ü]bÚ„oñµäñS#tjÊÃÈIÒ¨Ù£ŽRÄ­Wç£_ú‡9Q¸˜!ÒiÌͺ^ôëäœ:Ù&² -±9W®G8)‡º›mUÝh)lÓÃ%½ªo†>®i´M7¨ÔÚõã;Í.Ï-L+°Ñ³ÞŸ[iP•-ïv]‘„Õd}¿êᨼ¥Yš{"©«2Â/öøIË+6LQ^1N÷Äk -´}ph»]*ßËSYbµîj,sjá:“)þFôïÈGpU>¥’%ù>“¿š‡-g®fÆ“‹Gg3ÌE¾'â‹¢ÔŽe;DH̹XjNB—}”‘)µ :ôßò÷dKçsÏ›öÈ„–ä3q2YNCß •D þµÄ'{ï1¼.1œ]Ñ4 ˜ÍIýÐSWµõ!ŸloáË“6–˜y=èaé/ti„ÞÓ5Öë3™ÈW[¯ß{ëŠgõGŸí”Èj'«îAc;í[ìôí/ÊÝëß5pŸ¾Ø”þâì‹•£ê憾”o¯´ISGÛO–ÂOu½àÜo~^Rb1Q1ÕÉ¥Ô=ì&é6¸#£S¦¨Qã ©ž£‹óù!Äëµl@Åû_Ú¤ -ïæÅjÏÑQDÑxÆß©K[ûêâê?zU87Ô÷„ù<äÖgÿpIÐXë¦#WY*5•È$_`ArK)ÔšIwçßQ:7TaW ð]•N+ª‡(ˆM]æøû«ÍGÔðr:ûG­kÊŒl9cH®,xàEZÞ»ð¡jåÏ-œò~‡Ó¤Áije¹íP|æëÈí¨­K)-¾gl]9¥øHʈ2NáÚT{ÌбHj㾂¤•VMØÒ:ÇÌñ©ýµWŒgN©òæöî`%ën¸¦^F n[ñÓK[IØø%¢§I²K·,ÄK”]Ÿñ~ñp> endobj -699 0 obj << -/Length1 798 -/Length2 859 -/Length3 0 -/Length 1406 -/Filter /FlateDecode ->> -stream -xÚ­’kPW†±U(AkG × õ$Y0PÀKC¸+á@Q—ì&,„Ý°Ù¤ P ŠjQÔQDk­”ñ¤Å‚ -,,¶0 RµF¡]°ŽSüÛÙ?û}ï{¾óœ÷;ë@¡#!¢Q§!äøþˆ ‡agÇ'Q˜ÂÜ ¦Pw¹¹A€§ˆ 8®îNw®+Ã𠙚Ä$1XÃ_;gr¼x”ÄD0üa*§gˆ`)" ¥Ô,À“JAðÜ -9Få(©D‚‚‰(J0œÁž#òÃÅp}ÓF²·’%å4XCC®4"BàR5@P1ƒ- è½Pšäÿ€Z8ÜG!• -àø¹ñó)½§Ãñ˜Tý¯ƒˆ—)(”þ‚’øBë6ô œ?Š`Šø…ªK1—HQà­gqœ¹oLP$£D1@ Kåè|Å‘…(t|ó loÿpA—ý¿÷:/ÂN…¨e(à¼sÏ×лšN‰ÄT ’Ãâp ÚHoÿ¢læ‹Ã%À‰ë`’„Õ úÑ$AÃTPMÌfáE/t4 &HÆܵ:6,§£Âäqô­Ä̉ó}ˆãØÑ0ù®Ø2ÚF "§ý(2¯¼pOOB•äèäÝ\hr®®\ÍŒ"IÒSæßßÛZŒÑ‘£¨ -1z{‘GZìɪýߦxu\XÂÖŸn®ø£WïFxuÊ Ñ¹ùAÖªøIá€öp=3®Ód‹È#×¼º*[µsü¼áEmfAiøÑ=Ü:Ö¯B¦úëÌËfíW?ñ«O;•—>`æ^Gž>hëÐ;n›Ú¼4öÜ^T;Ùßc°b]pÎ:S×Þr½¾EÆLußã»VcÕ©'›6ŠžÝ¹¿Õ/)÷É\Ý)Þd=¿bD‰•öAx7»‡¾2A^U©±È°9`÷gƒ°T5‘™b–t¯E¦ÇìÊxš]8‘ Ï¨³ð¼Ý×QŸÖ4À>²Ç·Öb«yó sÌ+Óf{Á # §ßùƒËªWµÆ…^ª„ü=¬gZ’2U -Çå];ná5’˜PV³q2”™­a}Yu*âyqM½AOÍJÈpsw/ÿÈô9}A›n¦“¿BûòDuÌá§læÃÑõm=¾Åƒ{âu–®:›u‘ûÌêfß|Øè¶ Jü¾lKšÃ̧Ó&≂3‚ -ü‡ži»eø†Œ•)z/Ž`n‰ÅG÷f&•ºÔ3:-ˆ®ï3鶽÷âwmyî¶T﨑[Š¢/¬<ø·omÖB–e™a©­—ýÑ+“—cì ídôDë’غ¦‚‰û¤>åW4J8U\¥×t–îuQ+å&¿ª5Ô[æ‹79¿<0²«âÁì†ûŽò~“ö!þu“ýãºùæiy\Û|Ž!x\ó‹ÑÎûƒOwT87”T.^¹ºðµCû…ÆÝÎᬦ¦ŠžÔX‡S›6‡D:í³‘ˆÊW¢%cuÝ–ÇdÂÚ©Ò4Þ1ÖLE[ÁîhÞäPcË£Úé3:üŸlÛ>׆èE1­{ ï†\üÙ·!½Ù:Å\î±Óà’A¬£?;Jø¬ÅdÇñ%Æ-טwU»l4þîºÖx«ä£ÐÉóð`@±UYò7eQhÎsõpYdéáœfîB+ŸÅ“]…UýdrÎbiEiÍ¢°½±ð¹ù!íÞ™ *÷¢ÆMèhØwîtá¢Òªä¢ŽÑ‰&¯+ë’R>K3û0T?KŽó=õÆ•‘­¯˜ÜfÙãæ6bËåiyfË> endobj -701 0 obj << -/Length1 750 -/Length2 628 -/Length3 0 -/Length 1146 -/Filter /FlateDecode ->> -stream -xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž4S0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22´26áRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥rg^Z¾‚9D8¥´&U–ZT t”‚Бš -@'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<(0¤s3s*¡ -òs JKR‹|óSR‹òЕ†§BÜ曚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l -‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;z`‡è»xEDDiCb,˜™WRYª`€P æ"øÀ0*ʬPˆ6Ð300*B+Í.×¼äü”̼t#S3…Ä¢¢ÄJ. QF¦¦ -Õ† -™y)© -©@ëëåå—µ(C¦V!-¿ˆ ©–& -ú9ùé ÈHú(Ç…é'§üŠj]]K Cc#Ks ³ZuÉ¥EE©y%àÄ ?-ˆ©©©É\7¯å'[·dMßÖ¶²Îuñ…U¬úœ?O¬}y“ý@ÄŽºÙ™)µÁ¦óÓK–¼Zøhkßañì‹^ÉÖS…‹¶HöúõÄ}Y$¼fkׂeL÷ëݯlîšÆûO[ý•çá°sZI[í/z<«SYçæåú<óR^8E-Þ÷ýÞ5n!­ IZJRæ7W°ße¯¼ûüêiEÎæyÑA÷·'ÄV/ ?czÍóÛëTéær“]<–·{²TBì¾ÍÓ> endobj -703 0 obj << -/Length1 751 -/Length2 632 -/Length3 0 -/Length 1151 -/Filter /FlateDecode ->> -stream -xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž4W0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22´25âRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥rg^Z¾‚9D8¥´&U–ZT t”‚Бš -@'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<(0¤s3s*¡ -òs JKR‹|óSR‹òЕ†§BÜ曚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l -‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;z`‡èû8z…†{iCb,˜™WRYª`€P æ"øÀ0*ʬPˆ6Ð300*B+Í.×¼äü”̼t#S3…Ä¢¢ÄJ. QF¦¦ -Õ† -™y)© -©@ëëåå—µ(C¦V!-¿ˆ ©–& -ú9ùé ÈHú(Ç…é'§üŠj]`ºÓµ45T0425R0·0ªEQ˜\ZT”šWN-ÀñÓ2¡˜šZ‘šÌuóZ~²uKÖômm+ë\_XŪÏùóÄÚ—7ÙD쨛™Rl:/P1½dÉ«…¶öϾ(á•l=U¸h‹d¯_OÜ—EÂk¶v-X1¡Át¿Þ`ñÊæ®i¼ÿ´Õ_y. ›1§õ‘´Õþ¢Ç³:•un~Q®?Á3/å…SÔâ}ßï]ãÒ -š¤¥$e~sû]F1ñÊ»Ï/zÊíO]Ù3ÿÑÆó½EQ’žý^ÿŸYì^¶Q¹íøgíÅ×ôI\Ýä÷LèÐ!~ç³Öy?hKDgêV«ï;®É÷þÎOý©w_dÜãæf|üfÇçg‚û¸þ81Çú`¶©Ž‰óêü´¸5q¹­ë•ê-Ûa·ê²Kô¦_j‘»•V^,•uþ ÷êŒY³uU¾öíx”ÿkÏÝ:›KŽ©¦—|[[äèɸŒoÅ_;•¦˜œ -Ú.í)»çG¸«DǽKÚý|æÁ¶3®Ý£]ÇwÖºåÁÒ0¿G"­½ÖŽGÍŒÝäÔšcÓr½Ä„m{¬­_¶íËô}çŽé?áÚúçuÞz峦òÑGlÊ -'oúg¬õÉÔs±RÔõå*Á%Ï -endstream -endobj -704 0 obj << -/Type /FontDescriptor -/FontName /LAJUWJ+CMSY7 -/Flags 4 -/FontBBox [-15 -951 1252 782] -/Ascent 750 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 93 -/XHeight 431 -/CharSet (/logicaland) -/FontFile 703 0 R ->> endobj -705 0 obj << -/Length1 1612 -/Length2 12917 -/Length3 0 -/Length 13748 -/Filter /FlateDecode ->> -stream -xÚ­weT]Ý’-îîÎÁƒ„Ü‚Kp;¸»;ww×àîîwww'Øãûnß¾=îë÷§_ÿ8cìUUkÖ¬šµÖÞ‡ŠLN‘IÐÐZ$jmåÀÄÊÌòðÝÔRßÑ^ÆÚJšIdìø0r"PQ ÙôL­­„õ@Ÿª C€0ÈÀÆ`åááA YÛ¸Ú™›8h•Téÿeù+ ïúOÏÇN{Sc+õǃÈÂÚÆdåðñ?Þ¨L@#S @HVî‡Äw1­Øwe€È -d§gsÔ·05H›€¬ìAt#k;€Å?k+CÓ¿J³gþÀ´èìm@¦Û@. ›¿\Œ¥©½ýÇ3ÀÔ`l§gåðÑk€©•…£á_>ìFÖ²±³þˆ°üð}€ÉYÛ;ØØ™Ú8>²Ê ‹þƒ§ƒ‰žÃ_¹íM?Ük£HCkÇ¿JúÛ÷óáuÐ3µ²8€\þÊ¥šÚÛXè¹~äþ³±3ý›†£½©•ñ¿0ì@Æzv† {û˜쿺ó¯:ÿ¥z= ׿w[ÿõŸLìAF̬l9 >r›Z!ÿ +#k+Ë?솎6ÿô9ìþní_3C÷ABÏÐÚÊÂ`2B~·vøH  ýŸ©Ìü¿'òÿ‚Äÿ+ÿ¯Èûÿ'î¿kô_ñÿïyþwhQG ‹ïz–ð ðqÃX¤Ý1zvÿW¸ž¥©…ë³áßUAÿ ùÿÀ‘pÐûh† •ñ‡ ,Ì,ÿ0šÚ‹šº€ åL LFzúÛ®le²³0µ}(úw3L¬,,ÿæS2150·ú«õœÿp¬ ÿü‡HSþ–û&¯ÎðïwêßQrÚ;(¹Ú|ûRd¬ ÿsñÆ·oÖ.w¦ÈÄÆþ Àõ‘›•Õó¿Éö7 ë¿Ö2zv¦.’YXÿ.ü?~ÿZiýŒˆ•µá_³¢è geø1^ÿiøËmàhg÷¡êß'þ£à®ÿtÈd€°4omÀ`–œ–âP…›50&¬ÑÓÅ -9hST«”ŸëSaÝé¼ÉS¦ûRÈ\7þù­ÙuîØæuW’~o¨ Ç‚¦3tžCäIA׋¾FÝú‰aϨ]„œr¢î~1+½¥ÎÅ¢²·5&¯ ]øC<ÞÊnwñ@çCá”ëƒEyoƒâeT…݆V†Q•w|BwøpOÓ7<8ÐßyݽKÈOÅë…Læc›I( ®\æB“RDxÕrñFªÚá®MEI@j)ýGÎ8gÙªEú%:¥E€/NÆN¼i÷—ÎåôxŸ`Ü8ÏTÖûŠ#•ˆ=._=ÑoÿžëIsJÿ‰4Ø’;ˆKÚû`÷*Ë -ú?Ý(Y3ƒòmE5Î0»T,Lƒ!Ž¿P„šlì©Ü4¾I™€^Š3‚­¢úîgUõù[»¦Ì+O¤ ³´ìªÒðä˜~aÕsåéÕ] ÷þ–ð¯¿Tÿ>*NQp"ïÚêuæÔCHSâwϦ¦Xž| ¬+Rnk”žQzˆê(hFm6!œ È¡ôâ‰C -¦Œ¦@ÁÑŸIù©ñ~Ü{ê²n…‘\väëvä؇CŽ09“ò9Òã–æPZZªå÷[©KoÔØ+#?—$’ETØ>Ž,¡Œ§óùòGá„kµþAEЬµâdÚÉ~œ!÷¶ë‡6Ö1@tC6FˆàkKÅ¿q‰¨E´%• w4%#D=Ÿ®ÔÏó¦›lǘ‡dÛ·8¨=É»> I‰kö -å~”óJˆ"Z|±2BWÒãTiBûCzÞl˜G¥Äôðv¸>€¿0¦jÂOF‹™ešGC±5¥CÿxÉA>Q¹âØ×Zpk·ºË$#5d#HÕÞ$®Í3–<ú€|\ó;Ηx÷ò“8ûvßÎ)VŸ8–W–dê"«!©xEUMYõ£cG·æ; —Ö¥n~ˆ¤Lšéq,Íò^t/)® ;t)ŠÃ½[lEvXTà»V©À×™&Ð4{ˆ ÿ*ü¢±1?›†ºµEÞ¥Z={Ž@¯F¦úØ ¸Úuà“ªøóòål`ËúÙÈFÿƪe ¨d™tukp6YÒ…þ3zÏ ¡Ç º–{G`B¹5×6ÿìó;¼¨\¸ z—Œ EƹØíPaÖ­^þQ‰b¬±_Mw]?,=G9éŠ`UPO…‘y¥D4… ížüô-Þ.²çg¤<ÅeÈ‘\n ЀÌí2óš›ëÃ\s"G¸,Î0˜°¸47-kx¸ÆJ8úûÑ÷ü˜ }ìÑn¾gÎW=´o$Œr%…ÂÇQºï së–¡94öã8¨¨ó\h ³2å·ÜRÙšð‚ÏõàP#—ßê˜&\÷ÍNþ…ÈÔÝ¢>B”c%ðÚJSßv¾C@Ñ´á=9©òºçû ;Ù£ñÊÞ¤°úî;ÌN³ùÔ8È”$>Ä…õFôtj¯È®’‹ )“8"c˜5ï¸éP»†ÄÍé`¤0¾r%ç‘f>Q2šÞð™çã­¥¹! -«…Z—©._”ÌŽ«)­X[: ÃòO-zz«—%cýõ†²b×+”‹9_kE%ÝWlê¤ô%æ%èAaÉp}¼ÒšyʘLW%)%t¿ü=ýa¤{‹7篡0²çƒ²AÝEÌŸ.äzR ¸B8+£»£TK÷¦‚ö]݆fèi|ëæa,NùXÙ„G’-Fõ,¼¨1ÒB&œ¥&3ï[åÿ?U€'¯`ç\Äb­,ÆM»^£J¬†ë0 -)z­ZÜ -ƒ‚\†ßÎ*¥$Ûb’Ø:¿P[x9_rM6vP==¢çCõŒ«;ßa.ñs+×ÉýÉ™5פ&¥6]bž7|þRge9¯*Vâ+Yî;¤“7ᦹ3àfû ‚Þ’¢j£à{}Ñ9ùÞ;[¸ëzËHáÆ©¹œX S ‡X®ökuM†#MvøI›µ¸2éùªM¢xàÝ–Ã¥c@JT=]!¯;xt¯²ô¥këÔ%†4ÉQéª%õÕLUÕ‘« ×"±–Ô×Ã#¾à¨šâ'1ÄW3%¯1CQoe¬_›B³¶$IæÃH‘$D'ꃪ„°.]GÓŠjË05Èœq‘ö¾{®òFßø¿ô˜°$ ¾äRWUOS©¼¢ßõ_¢ŽçÁ‘sAB×ØC–…Ÿ´Á‘Š¡pÍfb{?_Óý–y!ÕýÆ|В̲戚m_YÔÐÑëá+‰y&Z¥£ 7§%ìxÄìsäJjq¡¿÷Á.8§ÆñúÀÝÖzgÚœ–>ÇÑ'* ‚±ñ“\È é=NžÔ#QaÞdû,îgE‚’›8³›?mDQÑKbvÃNÔ)qÐÜI~ÀIÉ)²Ì`ÊÞ"Ùš£Oî$Î(«šÇ›ã¯»í Ø®âe’ÒƬâ)ÈO×öViâm<™ó¬ µ%äwŠ’+¯¦#•'Q€c~©D¥pnX}JgKêq㮼ÅbóÌŒWÐë ¿9T‘ï>]¯‹brÔnï^A«C}MÎ|z–ÝxÊÿÕ`Uažoå²ö¾òÅü¢t­ium<+&ݺŒÒ+kcÐIl-rÑdMõ=¦K€ -Y¯¬¶/ölÖã,”’üåÏÃxJ±röHíœëÚèðøç{5?n6™ª6_QÇ•oŽ{H_ÒoÈ‹üqšK óÂyô LË2¬ît™yŠ(“Ùú¿ÚxŽ™I¯Ág‚éШt¨Úù}‡d ×w,²ìiiádõOttËÙÆÁ€Wš-Q†$ár33oÍ\ -»’תxØ?ÅÄ~“e?y¬˜—4È7¥Á–»Î6ϼ„IŸÖ2]rOlžîç¶Ë4~DCàMH)|uržæá°•uÅÈiq·VÏÈh…Ušc¡²Ôä¡Æ^Ë(åŽ4[ù¿ç €ÌÙ¿",¸Œ¸ Uª¾Ñ±½H÷_1…,.‘JÓ7×,±üfµ¦¤eì.ÐrL÷–ÕÆÜ°=­ÏÿÁÝ]¤k.EíêZ­àSnïJ>vŒyD/@[Š/Ü:lMì©„Gn-cFcM| -Xy%ƒÈlNΔ¯Šë"~t`Ž6qg'Ðõ“¹mgÒbŽrú~!éƒYLH(Óëo•â¸u AíA¢Àýô=¿\Rœ'!¥‚—tŒ(ú]±õûg L²ZP&ºÌ·-l¤Få0“1>D+‚Ū]*3'^e3³2{=øäß-äñòZ‹¿¥u²[d W»Çžë³=ZF™$Kfp Üìα[·¹0@'E¤Ð%Ä1-aZ Éx÷ØÞÉO²•²Mwêþ<ƒ'ÿõ¢­Ž¬ŒnãÿœÀêlT ÖCÒ*ÀKŽ›t‚vú.»¯÷ª¡Ø¤¹ç§z±ÌNω EÊT”<Ê#oUø.>Æs‰g—øø+ -±\°õîNàá@JOì*Æ3Æ ½Æ5¶UBÄκ‹ã^î©I/©£Í²¹®B è’ã²EòÄÓ:à<§ 4ò \vÇ=9o¶ÈÍülÞýØÝ„#‡ß“¹¾‹:¡ˆ?•î舚.j=¶ÑœkñX_ö¤pB¬)*ÿÓ¦´ŸI®×›üOS!_Â$ÅB·J3¬5ŸÝõ½Ñ 3„²´Õ™Ùöĸ¨Ÿî×P)®ùRnm—Á¨£4·m5ø™káofë¥A±¡ãz‘Ãî÷&÷6Ç®&úgÓ޾Ģ¬)\–Å×ÓM'dÛm9%[‘JK²iÍ­‚ãª0%û5ùJ_) o\ê0† #’h ÆQV]Î ^!ÚMŽ0 ›x̳C›7Î)öÖè>oÓ R:ðœÉr߸C(‚”@%€QÝÚùT¿ÛXâl\=³Žþù%ºßj¾øi€v´¹É±¥ú|F®°+Ð%›O”ƒ?u¿žµ‡&£%`nÆü ¡—Àq¹ˆŠN¹JÛ°Îr6ý“EbÑ.¸x­g¡yu[vdÌqÓ&pŒc,‹uAI KóŠ¸mbŸ}ùò³&öË€æWóPÏ’5D¶ïÕ>|»Äcôp„1š÷ÏmÊbü®:Æþ¬ôß„Yñ<ù %w6ø¸»_o¡iÙkîseñÉØÙrO¯ÝòGi†É¨÷{`£ÓE/Œ¿ªTå•e¾Š)s<Ó“åiÁƒkÃ^:º`ûá &ûÎ( -EÕo"¬Áyò°•ÍlbM7ÙH,ê«pêPÈß"¢£ø²^)WÃ,bœI¸÷BrNÌ‘êDP֟ߘ5ŸyÒP•£¶¦jŒ“uæ[L -±lÌ Óì'MO:”©f¬½õmÕˆ( -³wLâìaó„ßÍÚ“Líuã‰Ì‹ cL[VôÖxæáìÐÆÉáôgî’”I©U²=Ùe- -Óõ·ÖÙØ6‡„ûê^êÏêôñhÊ Ö¾|r§´’†Ý[ØÎ&Ò‡ª[·D:fã-ê -ƒ„`ñyÚÏɆºßj>›@æŸÿMÖ`Óï€>ÙíôH@O.x›™íÔê]œ‚Dë¡4ðÅÖÿXš-##'5°=$k ½¸ÎìkÓYAO$¾)g¢ÝcÛA­-÷ŠÚgw[m௫’ ÉÐCÌ°»uÌõ@Ï^{;ÂO©˜WõÈ/4R:ÛDío¯h1ºȤÌ_QcÜÖgDßz<žF”S¿~12…k …HP¢”°í‹¥ä®ï…fÖ…E÷ÐrO¬Ò?îQ÷éo­`âWz%ž‘ö75Áõž³t©ØV &õÇ<&iì’QŒG¸ð~w*ÊS¿%Xáö¥›õ7 õØb4R½ý‰zBæ;ÓyǵzŽÐR§58¡öG`†xï«ŸÌ%žìsþ“U]‹nmnH -ö`ÔòFä-!Ô‘º“†Ì´¨ž½F8½KVâÞ ýú½kØHH©ÝíHD§\³V1ðz`¤úé!HÝ÷m¯&ÛfÈs~PÇSúçóyy;Eú‰Ë¨¦h"ýƒÏ¢óŠ¤‡±TÎãÀ30Q'5c‚ž›7ót½T¿àbÿdÄ\gOXWžís~†Æ1õ$©Îm§&çî– ¾<ó€>Íø˜X6ÕÙý!Úg{"~CÈn÷Ôd¨¬#µÈðRª‡Eo“á³#Vn ÿp·ÚÐ@ÅÝú:FÒ##n€Ôš†á†™uT‰~ÜJ¹~¼’HÆnîù³ëÑ¥óýŒtÆ›.øæÆI?üi4}|²“ß<‘Œø0k¥‰cÓÕÌ;.G®Ëc£¼Í *•¡úö_E„¸›b`Lq%`ØÉZ’‡‘øƒ™ ¯c¥iÍjWN…p˜gãÇdv‚¾Ù„® =‘;×2ˆtÄ1Êú.Å]5E½Ý`Ï(6Ä›´ÌšR¦Þ'¿”LÖdæcOÉ©Ä*ãu"àŽ,눔o.i;„šNyWÔjë76 ä´ã²éÉýž~GNµÂÞ^¨õEù$ðj`‘äÕøÅc09|£³£2OßU ð¬`ªÒ¾üŠÈ¼; œh4ERü*Æ^üö›+ÇvÆ\˜Å~뾚’SÍcš%Ã;º'cì½àIàUCÍüAx*Âù  ŽD²$%½"ñ0‘<:°“¾S-Hkö#~N9)í+ƒ¿,¬È¢ã/v'wo¶ÐÈHEáóø7…Pö¾CQýgHBñ%¨~ dÆ “q7éôUrK“† Aãœâ•b§áº)Èdº¸È@Á€âIÖÒ}rÞ÷"'ç¶8e0;€Ñ%U7šì ›z*µæÀŸº–+$»\.êN‰¿9Ý[$]  Î"Û+‚Õpžþb êãû:KœgYZïkç/ÕPÇfݦ÷þMÇ]ŠÄœÆÞ©h+Zš2à"¢j¬Ê9nqDÏxàÑÄIº›ëÆI‘(ûã - k|{É„…Eù'ÙöˆúÈ«C¢¼HŠçËÊ:Ï<_1ÉGBå€*¥‚³„‡ušÖöA»£DÒšäæ`>}h¿?¥Í×{4Ÿø+Åù‘N—#¯²ý†ù爋³ëÅà„‰÷rr4± -.¾^V¿Æ™LŠ$¸bZ”æÔ!ôZNÙvHÉ©|¢¢Šn&²§œ°ÅÜzggk©’i?ÑÅûéÂ7 ~½N?”ï³7 ›ß` - Zü¡ï¶±;¶ÈRØ¥ÅR¿‘&#Óvæšú¾ÕOO703ÞîàöŽ[Xù7˜î }3jäòo¶óÙy»Ó^5áŸC½+$§ÿd1¡~V‹¢¾×ûStM‰7 °À¯~Úœ]5Ùv›’õÉg t ݸ:ßá±R#ÚˆŠe! LŽQˆ9¿ -2PþéDÐCª=åúË_ú÷ïh5â5lNç0<öð°h!8…:éY¸McÄ(ß9G/Ûä€uŒPX ×|@¼ÙÚÛ®Ìë9w‰ùRÃ~ù†X1NJ‰w!§ëïS„k°àðèûE¿Ž¤ 9~PIµh;nþô!:†Õ·†þ -÷¢ù‡ÙàpXõ c‰’ÏC›‘ÅGËón8ô|yÌÙûÝùñ8+Œ†&ÒgæeZŠü-n˜½WÚpߦDNRëFDé’SZȯr€p®…·ø¸•î×M©“N-ÿÆÏhQ,{²ÒÆVì_ò -µÂ&ÊøÃ_îxÉ$ò¾%É*'ù”ðQÙ–LäžÒ¾usäZÿ|Ûe½å©¿6Ñò¸¨Û{Úô±§>ø~ÁG®.ž{áaй -]Yëä!åñ>íòÏP›R¹¾"‚ŸsVˆ­_ºæÐyjz »L b7*_»ÍÆÀ Ä¢ýp×î6é¾Ø´€YéÞ'íS“{`¬ñ†…Þð -kÞâõ}I›+ê{¿ -·ìzŸÔäØü韶sI§pvFÞ8õf÷§‘¶u["ËþÙÔäIf—& -Eº5øÑÖ|`•*@œ¶ÂbX~XPV¯†ÜïI+äS![¢ ½Û/š¾‹:;S 38±%µ1(Ï¡­ž½çR)`Qoº+t÷ä@©LÊJóƒp¤º/¶M°¡’8ƒoÇ/õîÌ?gÝv VM†ña÷¸ ã×¥\rÉD…†˜öŠÌÚCÓ"íù7\)ù*‰‹áHÒOö ڮ⌒'ù)Ó³Ó¢læq4Bi©C½?s ×Æ7Hæ¯")¤ÇøxúMx6¾åƒ,hú‚dï“Ƀ³EAåŒ(‚oŠW¬£’sçp#lqd¥Íƒ~oìb%|ÓA(ټĉžOCS¿Äd.fä>n»ˆç0CU¶ªØ9ç«@‡fiYdìãµf^ƒ÷îû1<ù’1a™˜[Ôøk8ת™BÏ©åM”¡’rPkþãó”°ã«•Ë¢‹NK3¢ú­˜ǸMJ^þ¡•X/ˆÏ—.UaºÉ«(ƒwd‹(`”‘gðq$kÉ¥ŒÛe%W”CG€„úŽ·•‚øjB‚óíN–ƒ¼¨UýüU¨ÌM›2h´ß÷:ÓðÂÜXÖE>swߜÆ-gˆ>òpÏÞc@bvÀ†ä'±Z.Å,Mk<Âñ\>»G0/ŠTÄG=I⟠Û'ê]^û¤‹Ä½øyÄÒó ´RÎ –¡g8·§‰×à7E$ÑßÁ’w„;³qUhãÊ ãUŸzæëÖm—Ñ5æ(H’…o÷ôîóÝêʆ÷z‚›58MâÉ3o‘ªÙ±kÌÚþõ’-÷‘3”#@dT­Ò\ÔxÁëÊìŽèèŠÔùTËæ·@ŠPaŠ‡é)Ë„W‹ œ¼¾iÔÑÛÊÙ{#%~»Z(§5 -ë|·æ”úºI­ª$L2_Äü“:ƒ°=Å3ro´ ¡2À8’-ŽWZÕ¬>µÑ6³¯ÙŠÛæ­ÿÊöûÀ^¦Ð]Hâ¥ì‡ Æ%ý”âD‚GÏÏZÉë¸Ñzåé–¥~mýI0û©°C.Enô’f-5r/–ÉàTZ¸…ß‘S‰¶ñy&ÂÉ7Rü[cSôŠ¾û¥ F°dª*–Û{X'O‡5®óBBÆ£±Þ\sï©flæú£·§á†*Cª~Š1×ÅpèŸñ"°NCéíPp r-º¡I,,ݼ§Q¢R7ÈѺKágÖŒÃe8œN’‡| -«úVL‹Ž\4ºoÞ¿›æ„îðÅlm¶ÄzizœY›ÐÀKvbüY¦f&…”¢ÑýYÝéÉ«¸l+-+½CÞ7¾b—¼²ˆ?ažŸ&6/X+âqçÛ–p‡¥ùÄÆ‚*_lÎt iÞ¸>Á‘áMÙ¹°2G¡ýÚ:¹¹rù,¥ƒ«1tÛ­úÀût9‘ˆšcãklÐ<¯£Î5™–Xl?¿', x±‚õÒ/ lh»µÓBzÀJñIžÝç!–|‹ó2äƒuK -ŒÓm ŠÂ ÃWÙx -­Í¦XF)÷饫EmˆÎ×ÿ’ /㘀¯+Ø35-Cwñj̓…*º²0¹€ÐðÝ}Ò4@’¹Nüe/ÐÚ°ö×Wh5ÒñtR -RüóøP–˜9ɱ Ž¿(8â´®•Ò—4»ÝÜ`‡RÃîGN›µtHŸô­[¥› ·Ùú -L£@®&Ï8BXuD¢Ï Ä)9÷…u˜‚h7?2"-šù=îìJôQÆ¡pÑv†á®Ã@ø¡×e[ñþl>ãv€dÏH4®üLÝ𓃹p^i¶>qv‹d$%S?Ã+à †ï ÝkƒE“è”ÓÄaÅÈ£¢®¯ Ï&–ÿz }UÇÏ Gf3€â͉íúÚhÀ„Ú}))å×ïK“Ã(Á_«qpqƒŽj @æK´7® -¯ÓJÊr8ÚU2:¬ûþ˜ÄI{.v8“42žwœ³ -n µ5­G¸†KN‹Ò _oL~ë90‰F1,•eè“g…ð¹ÜÚ?Þ×Ä¡Ö Pûî2(Ãö·gÏÎå0±pn­oJ¯CQ/À#©+F`ùaHó°EÞ§8ëJ%YÀÞOLŠ«‚›å½ÉºÏ7g .Mí¨È=i V8™àŠW€a:#ožÝ‚ÙI<†npýÛââѳïÐÉXÝ#úbè÷RÍÞÑa%옮“#?4¨áú,m|.³?9nǸ‹–®ä~˜·Íð8§”à¿ó±Â¼ ’ŒÄfXÖ£üœv* sÜ\Mž÷¬ó’ýÊïüê·T'^€oø œO9nEŸa†6HûêB vHŽ„còœp“$°£ö>°ÚÏÆ:‡Ê»£ýÑ2kû"nñwÀ$êQJÇŒð(˲p”ËgÏÅoï³=ÇVžŽßatÛø”¶ã'ä^ým×pÏŸ;sÝ9KN$RWæðbF´h-ÊëŠcB¬JrÆ]Õúô;däÏ9aÿþ¼EíÂFe8tKÏ^tŸL!FŽÉòÜ>`ð1 ÐhFŒzø–vôÀH8íöÆÞmóÁ _ƒš-“£Yaœôf ?.±ÿfgͬdv 'f÷ y‘?{âéó]ÍïƒÀç>Óìÿ²å‹”ÁðyʤKI_š?4¶É`RjÌ•oê¤É cÑ1¾!L0uA3Ðꦫc´}F7´…Âr©ûöüSâ¶Ä.x6Žñ -Tî g¦ë÷°—Ùdzð‰¥K'çšàúýº'xâ‘à÷PÈYa‚×ø§Ýåçv;©2Ã|ÞÈ{QA·DOñDèG)Îpro\ -¹13 ½m•6i)™Y,‡ÓŸm Òt*±L51»‰ê‘µ£,ù©¯ÖP@D³¶À)µòÿ¯; -_Þ"¨,'7žo’‰c8™Ýü^ ¨ ×àào9`ȦS8Ï_kÒ¸w›_<“÷ò²Wfj:&s#*©Z«Ã!þl-4V0‡\:Ž'p•ð¸ ³¡¼'´Þèƒñ­ õ¡r“"îÇwëO'u±HÆ’ >™_ÖœQ 5ÌWƒ[xöƒJÍX\’€o¹±ñù?Uì“íŠ@S…sàƒ%áz1 ) ÷´Yt:ÖˆOyr…éÚ¥E5‰¬†»c"m} î87žªúáXØí**üµ¸ÊskŒVF’Œõ4Å"ÆAþµ½áJ\µÐ"ìŽF8Ë;J?NháÄÅä„fÝ[ç)ì1ø'AiyðÚÒ/™žÃI3!¤â"úäÓ‹Û rqé†ûˆñ?.Þ;ÁSãNé•ñw¦Ë÷½^ôÓfô¹ß4 -5}Â^ÄñµRcCdfi&gŸ¯ØtVÒš`úg7C­ ’oe pÇ¢†yH‘œæ½ç‘Ü”ñh‰¨©°­û®>^¯‹Œí•8Þ³í¬‘U69Òéz1ú‘ÃÌåÆ´ŒÞÅ÷ì» ¯½ÌÓu܆BKë|ÕVtžRé;á.‚E’Sô5B@/Ò7!¼U’DŠúh).üïy „„ªÈ‰%Õ³§¯©!,dmí[%°HVî±è˜'<’¦]G˜d‚ÜÀë@v¦ç &I íZkôw“µœü¿ƒc^ÿX/Y+‡y&MÇ.ãkPNŒ4G”ùpºÎ÷L ÅìL6r\o‰3`RÂ"q>òLd(v‡s¼u$G¡.ÅÞK~«Šö¢êÊG#ê„t§Ã±mÕÆ2ÇÈÊ«éDIKŠóÃñyÎ!»§µ’%QIÌ6)Àà¥Ô›0¸i:AÓÙ‘Æ"ø¼pCX!Š‹Z—¿Z{æÚV°MÊëÑOöÕºU`™æë‚ÏhÁ<Γ}Ë ›ˆ†^ ;ì¡«ÑTP#í|wš—€ÕW3*½"gñk‘ì¸<–ýR%&¦.‰á«‡ ×vê­cᨉIEšrÏÄ—y]ymž~ç…þt]ÚÁØ,ßÉ«Ù*¢õÓ…L¹9†!š; ¨•w…ôבD‡Uðê–Ÿ„»K¸M—ÔªÓ]— 8 ëj£Î•ä߯~I0Yˆš±¢ˆr7„záñ¸^¼]s=T‰ŸÜ¡ÕÔiCàW›ÅYÊ,#j;u¸Ë5íÖ0ÐÚhE¿'©0Bá˸ŠZ ?•¬Æåq®ÌŒ0S[H¤Å¾î È+žC QU×z™¿O椸 -“|XÀœx•^‘c.!#£X»P’~Ã:Þ3  ü\ð~ä;ëI"ÏŽä*;‰CbB°ßŒ2Of|ê~ΈÒf¾4Ø={P8Ö*¥‚´’MAQöÚ@îl:…©þr»”\ãÏgT¤>5_tô 3› -Æw+ááþà^Çšõî8諃v]*ö¼Ý÷úçþãbÞ1}»ÍŽÆÄéëÑ5tZ¢‚Yxé7|TœbÈô2E´Ážÿðö`ßÛîMÖMF7?…# oƒavS^¬|‘Œ_BF.*Ž*ó“ÈÀçλzh‡‰¹0³¶÷ÄOyðY$Ö6Uí÷qŸéÇGîìט̌cu]|Ä—ºë0h'ú‡“¶Ubû£6g>i¤éé¸0ãhMŠ÷¶šUš\¹ÿXôï+ù-öÇð°šï}Bß¼ÄÐù÷«Ú^]|–InԘċ?|Þ(ËÖ:©/—<2‘ŒÑ׸°Ö°êê~Õ´4=[„j˜ý÷ë扷J=*¹yë_ ÙÞ±ÐÆ{Œÿœ(’ÀpÚªèd®ì^^H<6t2[8¾ÔÓ‰Å[mÁÈ)]KRIIžé½|sO­†ÃZeee½üì¿šX}IBÏsIF! ’2,`TÚdI?œÅ¯r¾úî.*öÐÏÑfêqÂí{Ózb- “¿lø­8ÎÞ\u=žMRü5“s(jèɃ¢ŒŒf hJÆ;–A'oæîîú\Ã.Y¸³°& 9’ŸýǽM?0)ry¶ÌK—ÄÂ/˜ân¬¤Ìª£¢IÍÇ,ánÅèa7¾Åâu©óŒ{ü;ÁÁajˆbÚƒ/yq7*[½Ñoˆ…æ[K-Án0dB·žJy5JbOoÒÜæ›´”d›Ërüú“]ÍÆX«[¥æ¶ñ¼ðsj!Lh€„)s¤’ù@’à!˜kÅž¯Oƒjv›€h›õ¾˜Àý㯡öÃåÊç¶ôx$>ýÁ£xãMëÆ·u^ýJ/ešXè­¨ùrð-°Ã[W¯I—SWLÿZâl8§ H‚*g!7t9œþ¶™%KÙ ›óîõ}¢Eµ>`ž“ñ:jV¸C&QL>;*IJ ÷y´õ|‚‚Ђ -U;ü„"µIèbpa¡ðfžyÇâ£íDB‹LÃÆ’Ž;§Az>·BíñýQæÌfh£“5÷x9TÁ…r%÷/]ÈsZrÓ Ïë´Ô°jòŒ!óÌêæcºùþ¥öŽCryǾÉÜ©ôƒ‰Úë•ÜUö¥ÛÒôÖGZù ±%Jsøh/µ¿ÃÉÒP.M”ï'T$­TêLî…Í‘¬÷œˆIT™Kà9ÐÝèºX0)‹åÏovéd+Ô2>¹ ÚR[X²&O„XÀ“e~¯d€”Jœ¯÷ñ" ÌV'ô=GÂ"é’ÜíE -?pƒl»Î5’º áð=ycÿx¢çtt[Ÿ§ÛÀ¶’f°0·-ÃtóC]Mrý;•‘óWéù±­ð:âЉQ/"ŒÓß¾q ½}>GYŽ-K ††çÙ>ñÍ4ÛôŽ b›Ÿ½PøgË …Eæ‘LúJ‰2Âɾz6¸qEy){¨*g#€–÷›U«‚doaô lTÀ[hhv€=ÅcA”$ ÅL9¨áV/GÐ¥%Ç·D¹ Å½Å:9 4ÀáPËâœö -jÖÏÍmþDÊNËÍOL T«Å€ú•É¨Â_l8,*ŠìOŒ*^سá[‹¢¿ªvÀîÓô˜ñvž¦ºS²7´;ëGøúrL4mVbÕT( ›ŒÙÐPÐg|µÎ<ü} ù\n7g™2öýqÎòÀ®q!7¼s°’«øÓf-/~K‡µ†Ÿ££ÞK ‚ÖV¥Ïa‚Þ>ß"cIðC˜˜C×RH€ò|)ðÌï}ÿc?°æW4)J'˜Ö…\ø I"oÄ -dzfŠî6Ë‘H”Gâ\{^ ;ãdO—R#HjonŽ9 ~£¬“9Íæq˜ -rÀ–ï*+õOˆÒ¢Ézåógs+ز6Ã(S=8Å€:ï…Í«²t³ú‹­ ©M#ÚG` õá•í¼‘•ÀF{Ñ…' ŠPÊÊà^ª÷žC¸X»èNý¤G‘Ý y§±À]îçìB1·ÑrgéR*ÿ¼åÝrjUDy‘Ð2IÊèß ÚŠ M§mË \Z¹Ec¢˜ªjñU õ“l&‰5¿3Q±ˆÏ¯O´gdÜ«òªv#1ý8•Ù†¤EVÉâòð‰ò—µZ#kÄ\J,<õDPV;(PÕïJߧ‰Ô -¸z·0mÓIœ±Ðk„j·Dõ:v³LFPÕ3–5~¹€wzªC~ùÒI|ÓGÄ͈J”¤ùå0CÝðl °zyß»ï]xgÕå(R-¼5é%n—&"–ú”<,<ÿا4‘‹ø-ªÚ"L1/G7 „às!ú= š÷¢¡Pd¾ &Ú¯f‡·^|·ËN¹7ÁíûÄȃ ´ú;Q&|±Š>Y¿»¤kQÚtÏû1æ¹›Ÿ™°+ip¢ÿødUª -endstream -endobj -706 0 obj << -/Type /FontDescriptor -/FontName /YDPBQZ+NimbusMonL-Regu -/Flags 4 -/FontBBox [-12 -237 650 811] -/Ascent 625 -/CapHeight 557 -/Descent -147 -/ItalicAngle 0 -/StemV 41 -/XHeight 426 -/CharSet (/B/F/H/I/J/M/N/S/W/a/b/c/colon/d/e/eight/equal/f/five/four/g/h/hyphen/i/l/m/n/nine/numbersign/o/one/p/period/quotedbl/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/zero) -/FontFile 705 0 R ->> endobj -707 0 obj << -/Length1 1608 -/Length2 7084 -/Length3 0 -/Length 7904 -/Filter /FlateDecode ->> -stream -xÚ­TeX”í¶¦¤D†îînî„™†˜Á™¡¥;iîPéIéni¤iƒ~gï}®ïì_çìïu½+ž{ÝkÝëyiµõ8eÁp+ˆ†âäåâjB­œ‘z–0uN9¸xç¼ÏÈ(€X¢ p˜‚% -"4‚€ -È+**zŸ(wrG@mlQ@]#VvvŽy~§­Üÿ¹;‰„ÚÀ€Lw?.¸“#†ºƒø?Ôƒ@€([ÐêÊki?WÑT²(k•!0ÂÒ¨ílåÕ¡  aZÃ@‡¿ C·†äºÃ’E-H'zw â‚8ýq G(y÷„"6Kên(8 -98ƒ¸ó[ÃÿrBÀï2ïbw`Úp$ - B@PÀ»ªÚ -JñDÙZ¢~×FBïÂ@¸õ]&rþÝÒŸØÌ]e …!(ˆêw-+ E:9XºßÕ¾sB@ÿÐpFBa6ÿbÀD@l,`ys‡ý{:ÿêø?º·trrpÿsþ'럠($ÄÁšë>/ß]Mꮶ vŸû÷¢¨À¬á@^ž¿ü`g§Ä\ ˆ?bù½3¬w$,Áp˜ƒ; ±¾Ï­ GÝ•²üßTæúωüø?"ðDÞÿŸ¸×è\âÿï}þ;´’³ƒƒ¦¥ãÝüõÀï^$Pøûù_¹–ŽP÷“ý÷D#È_ ÿˆ -Êòn ²0›;)x¸xþrB‘JP7XŠÙ­-îfôÇoCPäNË?crò - -þ-¦o ÙÃ~]HôOÿù<xs«h뚪°ÿý5ý“¥}§:JßÝéŽØ÷¡ÿÓø!'wzrò -ó9ùy„ï.?PT@ÔëßÔûÄû/[Ã…€ºMïšæáýÓúÿ²Ìþ£ÁÁ¿÷De ß­Ö?¿Ã gâNÑ?·ý®åØ–qƒ€îÏNÁAâvI©É¨JŠÌîÓŽ6^Ìî §‚Oú¹Ù¾åðVŸ¤ÐeÑ’—¿*‚¸ª†ÄnêÝ'wœ®×UÙ6zÛȘ[ßAö³žxѳ¶g/25 -³oøs›&ïEzL¨/a™ñn¬ èèšçÿ¡jäGÜ;8gõ¥wÉö%e8szà Jüø†¬‰¨ -íaeÎÎ.ÓÛ­ó3æξžî®ÖCìöu*öŒ7xŒâ.X„L¾¯2¨¤M J<£¬òyßv–Ç··°ð/Î’W/ñM¾á}*Íyî~€Ô üü=Ÿ]™ÏÇÈÊksÓêò™ËK6ÌQ­]%&X'3ð=Y?±Œ–öŽîPQÝ÷]]ôx–LyZÿc X•{µR içË }šhwáÑZNc¥å0×g߮ˑژDµêÉ -¼8eRÃwH+ׯ~ÒÌ%Ûo1.ì«ÆÞæøZ{ûHÞ¬oæ»ä!"Ë«é¸O ‹¼Qwϯ¾8‘e…†= ¶OŸÉ—ëüø¡ñøØ%jíéa¯ Æ’¯h?ð²¤_`•*E }À©Ë+^+—)¢¡a'6°¥Lëã¿pféKaÇ°­“òÏðŸõë&à"›SqyTâô©½¾½7øYãõ¡Àî ¤yËJ5À¨ÞÐ ÷“]œ ›PvŽôvåÓTà~. ž ú6oÒÄ…ÊGѲt÷mnŒWW¬>ÜžWi$®þ`8ø+šK…I\æà3&¿4ôQÝ!£•O„ö Ûhž#㯣åÃÁßC;âT -ïQð"_%\Ö–5ê£Ä§ Ä5öÉR³qÑWg‘r þ‰rú±g}ÊOûŠ¢A„HÒÇ|>¾Þé÷µ:ŠÒaçh9žÑ÷x÷¥úgÞgÇMIü -Ãg9KÈ`-טwËC ¼XÈöµ­¦Fv-þ¾|8^äpk¶B½VéuºÇrÊHvAÍíúËÑ7—«Úf¦è‰°Iïš‚úÒW ¶§#´² ;ÍD_Õm•æXžø1Þ{}ㆇDŒ«c*¢ÄjöÃF)˜d]ÜYMÁ€ö÷õWáÂåÜ€ Z‹Ž -¤Ï*.¡þ&ã¡ îk³u -ÂËGœš"†AW²Ù3Æ¡H3R\ªŽñªV²#/È)»…†âo|.œ‡«iyåBn2uüSû3‡ÉjšÛµ›™Íéœä(J$°[ à–wH‹J:I2ÚÂÀÜ4ŠER!‚†¡A{vî¢ê'CñCgÜ‚4 ¯W:Û5è¾Àè'8ÜoÏß Õž¸V4·•2xë>ñ€{Äì ÉŒ¼–0Ïù±ýêxhßI›)Ö?½H²uâ=z³ýÏÕûCg½„—?(Aè&¾‚E­Ô9|Äš6a úp=—š«îºå(HÃhHtfeþÅ•º"5ÛŠsìóÌ)Ú³Z¢V×^ßFeÙüÂ=A¿Uç¦ø½]Oïг‡öá¢Üi=äxÕÁe¾)¿‚–ÇçÔˆ’õ^î0j´P°4Ÿµ·NbNšØy€\*4À¶‘4ú°ƒ•HÞ|ù\Ò÷8DÊ ýw´Ä Vvq£•ó¢«r6ÆÉB’QÝ’ï{‹ÐÄUU›]ÏJöéˆê+/ÁéçuëB5Ðj+Ëgn.ËýÆe^̼ -Yé=,ö_•ÂŠ’viž@©2íü÷Pò9èTr(xu7ËîÎW™oÏ tF -á­›“òð{¦T“¹„«?4÷¾óQø‘"ΰ¾ÞG)wsõÍïË'“Ž€ùÉð -÷4É›¯#^ã=]/¾?ƒTÿ4ÃQ¸XáÑá<#B#o¾TE:q% ÄøŸéh“%ܬ #„’Ø=á^ný5Æ:L§<ì™ÍË¥†­ÂÛ¡˜³®!xŸé“–r]azÍJ M½¯ÇmlÃ)¾òi½5°C “PyD¹Õ£I3†éò<;S•&cQŠQÏ”j3gµóbÉs’?wG Êô- í­;{fyœ¬C¨±8ºYä…œKN뻳l^ÂéMö¤„¤?}}x¶Þ! nAZ龬϶_3ë…”dÇ?AŒæJs K8îÖš’?†ïH½°'˜ôúJ¶ ã²m ^­Öœ¨Cc®ëºGæð.ãÝ™Ç@£r1…8¶ÆmÖï9„Ï7¿:é>´~À|¼£M~øÜoÜ\rդ탧V{3fGÄÙä®$³Ž¶äö3›éòêýyì$ã**šA¬‡CúíÝm/Yc ëœÔ‚5*ŒÜ­çËŸ6LwŽŽr™-¤Ø0SkìRWI'LD^DKPbá`l.Ä øcÚÚ~ŒS~\Ÿmö’øñf+DÆ=­û€‡ËxzÞˆEuópã·BªŠ)j•Êá]5Ïr2·TlÂ}"R?M`+›j‰Oó/¦èžK½“r.+îùÜãOJÙ®·SŒx~ø!Š]m §›ìGM<_··å+÷Ëb/kO’â(9!ô^>±• —Ïm¼ü˜x Z&XH`â¡‹Ù`†€Ë-wñ,‰L]Ä®„ÁRe¦TÇ¢-ºÙ&a€—fPé³ëòC&fk_^>§¸+<š×^œ òc#^4­Ä¨2}+(ÐVÕE½ Ý"Ü“«ûU °Ûº|mus_ÅDqäÎð0l‡¾³Ý‡P¥”ÚÛó¶·¼ àöÌÆ{Ÿ7YËáVþ°ïñ¨Ï/O)ÇñºÀæ‡ü§Ñã_ZÏ©ndMûÔ†°Ç$®ñç*´è»h1k^Lˆª-R`3E-ñ}ž«Íy…3Ã6l6ËkM°~ÌH[cp¨B¯…÷ùjvˆÉÔŽNòÁøœS»ü-5ÚÝù ê/˜T²LÚ4õ¸O‰:æd 9÷¸q;–ùØfI$Ge~pp"!ýDr?+9vuÜrŽ;~ŽYrš§}~ æÅWòëŠz$`¾©ÑNIòø½ómñí/r+Q¹·^Þ² -MK2ìË}_ -üa±ë`3KMPºKÎ}pâx)-|­³wâƒØa¾Õ³«Ê¥™ïÉ°Ûx…³»p¹—ˆ1 -|Ê6™)Õ‹'¡ìáâ7TX ôCé~^Zçrk®ƒÜó”Ó¼äÜÚ{²ä?h‚ôLõ}CÁãw)ôßËؾ÷è)î½÷zõþÂ9ß>rTz½òôþšxSC=8@hidé†;ðš *dd<ÜîÕòCd€ÿ¾Œ‹¸›W= …BÙ¤£ɶj-ežF\Kò`¡]Ÿïø%S®tAÌŒ÷¢y ¤mI'ŽЭÌÒTÙ«¸½zé)¤³5Ûó|³?ËzŒ1Ïû¹vdŽÚí·'fz¬Ú.NYõoñŸýtBî1À}Ÿþ”`y0ÆF…ƒ]«/ø ×´`Î,P׬O†Â{ÏTëµO\ÊÒïÉœ£Y W¬KQ×®ÙàÖd2A/³Š0€cŽŸÈoG›ôL~»„Ð(H`‘C^K: #L4b|—"©?í5—úˆñ‹ ›H¹#{èmÔõ½^þüÕ\šºÇ•ïʤ Ù}»ÏöžGØ-pÜ‚E§¥Õ>'Ÿ5©w¸Ü‘S7®ç%\ˆÛ¦uÏàá9Õƒ¸œáž¾§ù×´‡ÅKÇ@‰ óRÐ4‹›^'H±ÀÀvs^ }…„Èd&u·©ÀÛqntveåêpÍÏ’2ÀZwŠ¹zÚÙrm ‘º^-3 :ªbwÌ“eØMfso›¤ÂÞNžÞE f¸ŸîýØxÒc9be¿‰%AŽ¼`Ú ªMMñ yÔ…¯)?“{r¢RR|È(ŽÆoÞÖ \E¼Ä–éõ*†÷¾]®mÂèi ¤½ü‹–Xo‰þ܉¹<ÿZ_Vã—8Ù‡%NU•uüžÕâ,•'q×îR9^Ý^oGžy;µh©¬`šªvi•+U¦Ü'á8&Kf§:~Ì"æ¿V‡ç‰L8ðêH5}Œ§D£õ)ÊlHŽgŸ!1}j¨ê‚zcú&¢]ó&vª/ÉsfCM§¦A^ô]tBâ¾R3Z$Fü¾„Œ´6Ö¡m»ø~×d¤ú³,¾bk±#=­€Äª÷Ï>’ï£+ý SÿIï@¿k}Ó?K^ªð«ý³¬.^Žõós•=\ìO“…y›JøÜ“1Š-{:ïÑpÆèÒºë2†™ç•iøÔxÐ_¾ Ö1^Ù­ßy0|Ú~[z½ºž&~ÞÇ¡C”ª3Ÿ‰re£Ü8³§c©È§ü1HRrâ“üZ.´øI䜹<¬L Ï782†“Td»ý™Õiýôê£ç˜h;É1©êíÌ@kŸóðBôcÞ,Ú^ðª5­ðdJí(¢Y·ôÂÿ×»«²­Í5oµ•EžFÇ€I^Ê—.}º¯³K<ÓÞVâ÷®û¥ŸG§s¡Qã-§UO›˜/̵÷Cƒ0qH'qp3sgþè*ÓÚÝO­¶¼j•U°›–1i¾ÝQ. ¡d{:uòS x5àòϨcß.šôœÁaÞÛy€kDèû´DL¿óSÃœÙäÚÈ:1Qα—Þs,ŽéA‘ŸÙæX±×2Ð_ãhÃܲBòhlF-ÈîãÅAŽ^NÝ©8ï7`½ú„ÕÁ›i¼hŸß 5†Äáƒ_ZHP²I(×Üõõwº§ç¨Ü¦™N+ùTõIJ0µâÜ€4”áÅ9¶”AÇeÂI-¯®¥`ªÎˆA~¯@A4ÌúÜ! -cL"¸æ`Èxpª¤àÈ©;Hq—÷B?•­È'¯´sËê™HÁÇÅa•uùP8ºaŒî&‹ - Çsqøb³ZqiB25Uß´bVÏ7eÒäè~Ó•ÓÂ_ôžÅü´aôH¹ßËiê^-¶ØCoFPüzûÑœf8­aÉô+eáºLß[)‹îU²GK6؇=™F)·6né9.?ŽX!ö¿vYùUŒäexŸ¦ƒ {/ùoºô¢²ä|Oƒ>MÚ¨sï£ð‡ßXü`ØáY“ºb¢_\6e£ÓÝZ¼ú­Xó¼ôözXo¶nöluæ\!|ý¼Ä‘*”º:Þì·ÊÆ)x?›¤ÌPpA1=ü'Ìf-í¥aͪˆ*Ç*ˆ{BXV:f›QµØj”;îœ,2¾Õ+íge ~(6™¢¾)…OgXnËe<©‡µF+ËÒ˜vDdÏøNŒ^ó×KÇõ̲/jÑô[ñ3 ÛW>KO8oR/ üÏ ˜Q~߈‘áf*-]ݹ!R¥ožDù>Oì =ó -&ÂmM¿Ùi†·(½2<3©`Œ€6Í’h]…¥‡éðñjcÍS‰ÒÀPø$Õtõ—D¾)KÀ0¢¬F‘&ŽUY£³ä$ý9ˆ³Þ¸wv )Ÿq*º—ù;V5W 6¾sé…u’àðÐ9¿ô¬ZÎ*ÈV=}_.»¨œœ×zì"™:Q—·G%åÿxHFʽÏÜ`} ýjÖçqsD?R‘;—¼òñÔ¬û%‰´ë[ †ïgAïoù\äæ MÓq"}Ù&Yã d¦ï¼²»RlF^õ¼Ì[ãxëvZbq[ ÿZÁæ¼:Ü…í§aJBSÌ)(«8åì>àž¾5°'Ñù8þ@\í¢ãÄAQë5Å7©x²€Ót‹ZƤè{ôá…ñM -inrÞôµ6GÞg93+<½s›ëD›†˜ŠÏm~™å.%¡Íh™&yÜbYߣo%T‹\2ºŸct…$÷°²_;ØGI#ð,¸Ô:‡Šâ 'rÎéÜ•€-ì45!¥û’ù‘õ'ósVƒÒáN@JûM«£/Aö3c!=L® ˆë Ñ7¹Ö¢Þ“ý×Çj‰l£„×kãi÷æ„Ûˆô{&­)ªz=®;ä;«*nw"Ù©M)$Ë“ÕÑhP:<$ÄËñõ:ù¥úu×æ{±Ñ)»&Ϩxì-Fßt…]+¨§›}KÑ•ð¤ß×9{œ:̹%À;6æ»UJHž…X+ˆ`¹VsT—òõëu€YU40å]hW¡ðk©Å#v&û/¨2n¥Îšp™m}bú“­$ºÀqtý5ÚÃ毓K7>ucvÅôGæâ øü0'(-ëÒíE¾VñqDø{ñ}äÕºÅøaxKQåÏ°¡ÈÏÙ%¹ãEÛ8 ÉÑ ·‚ÏÛ} tñøô¤±MTôD—.ôØE´j”vo ¸ð[yߌÑ? •OOä5žw¢‚‹ÍVnê¬mx>Ÿ²#Î`ÞVå-nqÃ¥_¨>Òÿ˜gGF¡‚}ÙÄÙH°tãö­Íæã|ï‹Ê~-l³éRÊ^¥=óï3,Äy‹¨3úøÍ•« «ñá?ç!#¼_e˾’_ÍŸ'^*-Ö›­òJSŸWTJD—HÑ4õ—YMdWÕ8ë@ ÁòýIww©ë×af¤4èSŒ?ìÖ\ÞbµmÒB6¥Jœœ[U%ØM±9m ¾•´·h÷SÓ·™ïkx.wCßRÏ<¾YïçÄÖUEZü¹í;}Á?B -1hÖÑW‰,ëÌh"ç†? -ÜñˆÊ³ÊÐ’„/¤EÍwzM64E{WÍ7–óVpœD¥~A\ÁY£où¾÷™Ö|b“-%âyG³ Ñ€e‚ŽÓýþ<Ûe"Í»6WÂ(Y?Yß-vSÆÜ5“2Ãtíiy3½Ëžý)žE±]L{¡ú&òÉ4\¤6eEýè¾[®l‡üÚ¥µ¤wľ‘„é«Ú‚ÒïM­žBCÃ2KtO_Üê°zù$f4N" [¼©Qo+¯ˆP öDÍÝeÏàŽ9W¿ èì·7ናÎikï#–ºç8Ÿ?ÈplÐT¨u¥Óc¬[‰šqdf ÷¹áfM½bm÷hË©2Ö°I“šà—rÆ„·–ú’;Wf EõÒ‰2…žviÌR„‹õOi^Ðf¨tœŒõî‰}OXhr¹ÕèÌÎ}InÿÊùt>pq>µId‰uâÀMðÖ~®T›úœ‘=ˆÈuŒ&ë€<.»ÊÞ2X)¬Ì…Œ˜òvó£ > endobj -709 0 obj << -/Length1 1625 -/Length2 10429 -/Length3 0 -/Length 11255 -/Filter /FlateDecode ->> -stream -xÚ­µeTœÝ²- 4¸[ã®Á!¸»»Cãи{pwîwww'¸»{мûÈû;¿î=?zŒgÕ¬5k–¬j2"y%:c!PdãHÇDÏÈ5·6trP2°‘¦Y lŒ+,™=ÐÀÑd#làä¨Â@#33€‰““– ²u³775sPª(ªQÑÐÐþ·å¯ ÀÐí?‘›æ¦6òg ÈÖhãøAñ}Q 8š&æV@€œ¼†„¬€RLV ´ÚXä ­ÌÒæF@ Àd°ú×`ô‘¥ùßÔè?¸[ ‘ùÇ5 «Ðö/D °Ú[›;8||̦ö6Ž5pÌmŒ¬œŒÿ -ø°›€þdkúð°þÀ>ÈäAŽFö涎€¨ò¢ÿÒéhfàø7¶ƒù ™|xƒŒœþ¦ôöAó:˜Û8®ŽcÆæ¶Vn±?ÈlíÍÿ‘áä`ncúß -hö@S{c+ ƒÃÍ÷ßêüwž€ÿ#{[[+·nƒþñú/ æŽ@+zX&æ˜FŽ±MÍm`þ‹„ ÀÄø/»±“íbÎ@û -Dùwf¨>Dƒl¬ÜÆ@XYãGHåÿ]—éÿ÷šü¿Ðâÿ•ÿ¯´÷ÿ­¹ÿÞ£ÿãÿ¿¾ç§u²²’5°þ€-ÀÇ–qHþîÀßEóW°ñÿï–µ¹•ÛÿpïßÕ€ÿÒú—îß1 Gƒ‚ؘ~4…‘žñ_FsQsW ±¼¹£‘ÀÄÀê£ZÿØU>”Ø[™Û?ºúOAtLŒŒÿ†)›™YÚü-?ë¿ àÇ¢ü7åúG7ƒ„†¨¦Íÿ´[ÿñ”ÿ˜Ge7Ûqÿ‘‹ Èø¿yA®:¦oœºoŒìŽµËÉÎêõ?„ü‡‡é¿Ï2Žöæ®­¼™þÉþ?~ÿ}Òù7#ñß¡Qr4°1þ˜³ÿ2ü…œìí?ÚûÏÓÿÈú?ÏÿL<è -4‚ý½2â°HIOu¬ÂÌÖêéb‚´-ªUÎÏõ­uú¤„lr–é¿TÒ×Mp½5»ÍÛ¾îJRï uaXQt&Ïsð¼H¨ºs‘×È[Ùiöüt‹ROÔ"<.æ¤7 5ÙU÷¶Æu _ ð'Z¿ÙC_!?|¸§èèï¼úܽ‹K“ CÆí ‰@îk—‰Ë§©RæQ‹7lìñÐõŠñpŽüU°*ï:s -‡@4a×/#ãš²Äæü74ÛPÌKl3=k]qÇ\gn£¬4ôõÒ¶dêØ ±õ·øò<ûÊSõ8ûÞtLøª5Xløzé8Íac’¦˜®@ŠÆþ+(û!±aŽFfú²MÈã5º„Î X¬@hMüTÈÁDeacÏ!jyalcÐ3¦f´à¬òîØ] k4{ÌõyØýç&ªA¡J[ïU /ÑY —`;Ž–ÁÛÌ -€&El’‡º«.û¸@)Ÿ}‚„Z/·h£âVýûº_#RÆ1z*^ þ§œ²2 -œÐ"%´&9šVsàð'²Í|û\Ó‹b7:5ƒr·p¥Þf…z Îå!*¸¯¤Ò/òYÒ«­1I,V‹ û^/P¿ )–¼ ˆ°›n}mM0ní5Ex7Ñ=‚kk%!é\t®¾Åa=Ò}ÅG ¦Ç`I A -Bc R®rƒãúpC½û'Â’ºì„>6‘Kê`4à{%È6û$³8¯3³ü ¤ýTU D'ˆ†µÙ²c¸àvé΄ Y-’<`ãöªÁ/ãÛšå€(.þÔ)Á"N“T.@Ê-#÷¾qDÒ%£s†pG‹Ä÷.%_¸¤dþá”Yü=3*x!_E´¨¬ ~sFüWYFI¬òa³WeT~©Â}}‘ô™ûM¸Ð’jä¨à«K»çä+Y9Oç×(Xo/8m¦»9A}ãü-dÖ×AîàM—ZzÈãS1· -ûS•îº <»—ß•¤OYé*· -Ÿ„…ºý9–ÝEÉ\íŽÇ{*^ª LA§d_ªµ ,2þ”¸Þx’%¹ß]µ÷|·e Úýò,—gEYåÚ$ 8剒܎Ã&F0jï´B¢úô,ß¼ù} ”Þx¸Ž‚ ˆWJÂZB3”YO2—Rëº÷Ä -Úü”¦×ñ™W‹}*fj….Ü–Ëî´*wVÐ, -ã#ó ï)¾¡„Ì-'¡+øãÒö–’zÃ*jY“¯!útðê\äù¢7©<ÝX¢Üð{l3yšõšø#+z1ýVótQë ‘O¤gG~éó2¬jJa߈Ú´Ô¤Œ¾ -Þibdñ«åîÒäqf|eî6þsH á !<”ú —5Ç7±nZ3O{'ã!Ùaú£èMâ¾Ç‚ÊkÝlMKq8ÑzÌ<¸#Y* n?{ë|;5vy>LÖÙìL_9Ž)>T ü©óÓ~tDk\šõù= bYéÁy¢ø42o™úg_V„Öz™ -ó. - z¢³|¨ÚÔF@oÎ;Ž%š›Å—׃qKVÑ_Œ»‚‹4—%jè à¼áC†ÚÂÆV«:¯4¢p©0¾3Ö—Ï7¢¹¤S9ltÀùìx¹%.9„=î{<eÍß#ì<»d)°èÛd*§\·û#*y}q|œåBŒ¥mÔY‰lfÖpÙ^ÆD}‘ýeÏMÅpAde¼g‚Ï'_™,av?£‰ïå;²(qö€œœ“z¯˜TE(‘þ°¤Ã¤qÈ’ ­^ºæÁÅÁe2£à’6{5ÙDìÑøM -/Ë÷‚¾\–ÕδåŽkåu -°˜´¡ÍKƒá[¥Jq»&þj¬ô¢$ Ñd±˜j«ç×ùŽ:H¬Ï7]ÒÒ:÷j‹ì¶ðµÚ#C¶>J“ U|úÕñŠ¦%«BÄlßñËXR¬…û®'2Nd2±ßF€‰ˆÉâö·m.üšË0¥ÚÓüu÷VÝè¬ÞFgÂ*–CÀÙâÈU}@áÖî ·ÂDßëã£9Þ€Æ~•”¼–8…µõOä–.6Ð)£²9Ylôõ]h©SèxI¶øö|=$íЃf×tw#Œb«ñx !w'!’2ŽUYS^Ëë÷°Ñ°öLWÐÿ”Aë¼ÞÍÆâáCa2òŒþTô¾…Á eУ&ëê¬AqY¡Úèw¿¢Åoâz÷4Aaí»C´®©FÜÌÜUn_¾;ÒºÓõËÞ®ù±!÷| ÖŸO ÷"µëÀúôµ^U4rç«è"öË”‘‰š(¤ƒ¼*÷ -zv9“ êp…þbxm{Ž²^hÞ‚T<0Dãä>ךž˜îtá$‘ƒú¡a‰K½õï=lÈï ×V|KûA7ÓÒÏO6(fѸŸ†Q¥òLâ­6_ÈÜ ÈiÃ,wk³ÎR£_¾ºü"£« 5=÷ì1N+ãltÇV%MŠÎI@_*t±.;m[½ ü"–ªhë ‘W²æœTË#‰¥†öm«kOœ²xA/-†é7€ßŒìEcãþáã’指j*r¾–¼T¢³VÁqÎ ´ø?ä žäcüF~ÏboåßäÑ‰Ç ¹á<•¡¦I1N)®0ú¦s÷mU€=J½ýÛ­Œ3@ò]àr8¶üžIïÑPsÑlK~Gb…¸öòuÔyÂ÷š‚®%ƒ?–˜Ûž‘cÿŒ×èX62`ˆXšŠ¿F®8Ž_)ŸÃåZô¿Í‡y‹žÚöÇm¶9ÔÀßq¡2¿»¼$áÓ]jÃÏ»g?ÂG»æ;‘]7šÂyZ*Ðïù9õ.lcÖ˜»äw.©“ØíYâðˆ $&„7s\ÔÏ=6˜Ø,ï Äö¥¿Ú]—¤é"[g'—+¤ "å9÷•\S'¸½Í¹©Â_A_öryé˜K”ÝÐPæ$ÊŽèð«óöˆsùsA°é!¤sN¥Òr “Пx펔°ù bæ<©D_\ŠkWÆz ðK…H†˜Èù›j~ŸµÖËñ­™*íßjoŒ€ÍI¡^m«=^Å*P&.lÓˆW|•1:&>–ÓÔ˜j,å^éÜDÅvÓt’¹Ñ¸¹U“)u'™ºãTve“EuºÔ%b­Tm €lÔÆüýºßl•T² m .©;d=%ùmlw -áþ*èçdA0ØlÐ%;ʵÅ|眢 ¡î›I™ r¡“S4¢ïÀ ·ÉØík>%ñÑXÄÛojƒ% Ňr³—…Ÿ4ÉæoôEr¯½ä)0d^÷Ò(‘…Ÿ½Uæî&_Õ»k/p À£[ÔK -c~Ôž©zfÂ"ÒÈc¡a= -Ð,aÈXK÷rq‰°÷S»`(蘃kùÖî}# z +G‹10}W¯hƒPT}‡Úž¢GͤÒÂ?7†«5V¼…á”:“©VÍ+i mCÐÑ nkõ1~V~±º‚(E¼^SêHØbŽ†dR<`1^1r¥Ç¬m¸ßD„´ô=„ƒ™5¬L£I*†24’™\7TÆd~s'òjº¾†é»øÒýz ‹]ºBL·ã`Å-Úܳá†èFžhÒ™‘f£¼I<æbÉ® ªPYe¸0Àõ¥×bŸ i|®P‘4D|'†I`”yÂ-Jr$xv€Å+o`DH‡8c‰›Bʇ¹æº‹7$Èd¶3üÂ:<ØGÖÂä>9–7(z| i~”&^D"Z“Yð›çâ,Øl¹Ó‡^nbÎ ãv$Éãf2JmlOÞÂ}˜dU—Žâ†¢'¯Oãè'.Ǿ&%§O*)ôÎa[ò:ÜÍ „W -A¦Ïs_(ujõŽcsg"qþÓ¯VÔŸe³"NkøÉκ2¿®;«¬ŠÑÊãY`†S~”ê†Í8µÄ#y¤ÆË;Ö×ç‰ÁÜT¨¼5¥EÌVd›ÃkÒÚKHh“ -"Þgy3m)T¾møMÁÈUø«ì>îâENϳe·Âr|Y䊪÷žº#¸)|”}ô=7â—üM±kú2È^O¥›ŠZ·%‰;|Ñ\Dlçn¥ ±Ž%³j!`÷RÐt¬kƒÑY#BÛl1 Ÿ<Õx­Tò*_z"ø/DƒÖdã JdZ®"kÏ*n¥3#Å¢ÍÃ< °Ò’¯ÅeØ%qü‰["ãÿz¨O!ÄÀuÑ^µžÃ9Ïy%ª#ß?½a7h¹h}ýŸÊ YÆŽú… [îýDºÏWÄRm²°Ç4M±¥aøÂËkÈ\'pE*ªÑ°=wl™AWsÙÐÖZb¼ç¨´Ì ÐYVÅó4xEZ°î6Í}£ z8Ó#Þ1ÜÎKï3œo›ˆ9L‚HøIßO–i³£ªâé\T‡ Z"©Á€º¿ŽXÚåþyR:JÂpà»s+³çõõw[G7¶$ß’Ï™f1µbé0w(%åac‹døMÛ)a{©Q"lÏAóøˆWÄby*"Ì‚Î,·t)°q©_]›i™Û|©‰w¬ýü÷î^=;ìü÷‡e½ßýN) Çer„ÒÔÓeª jñRÃqÀ”,««¶íqj†i¾ká§ýi9ˆ € -©+¹´·Et ˜÷»®Î?ÀU%]"Ïp—NòÚñ×uJw×(b#4?I'5ø)Â3 ×zKa!ùØfLûÕ9Íôo -(î§íÇZ–†œ8ÿìš­ìy[^H~EO¶=ý:—–G˜÷‡ÙÖÅqì$]f*Âx -5æ舡!B™ƒ¨+âj½™çõŒý¹qˆØ$¬àtíÊÑ3÷mF„‘’šã s!®«‹¹™Îµ/ºË1Ñn‡ëÉPdÀ¤,üº‘k\&¤•‚çQÛüÆ•&»”†mÒî£O* ·}mA|Û^$*ˆ”åÛÁžì¡rÛWjWøñG$”NYèÁ4¬P:Õ Üç° -ãxÁUˆ ·1 -yøïÐÃ-Ù»6·R—ûûéÑŽv/&8fxP`n2áí_ IlðŠ=Öª&­©ÛÔ)ƒFFœj·RQHEoñÁG¶‘h¥sV0Ox¤aÖip.‡Ê[Èž¤g^™ÏŠ[¥Q ˜.Áïv¤cÅ9Aw§X)FzmÄ>Ô€È_WºˆÉÝ÷Çe!÷Q*ß.Ú5 ZN`êÔ´ãÔ'ì ¸9ùÝeâT=Î;G0íhsjsß»»=Vÿ¢bà(£¯ïxO™X ÉÃÎ SSüÚÙOLÌV,ø0zthþ<ÌV! yljçæY¿Óú1¼ƒ²ÿîËeVœ±§JZ8Å ¹M¬ÆÓO¤cÊažÊ†z 3+æµG6V= /Öyë=—nÊz°B ÒMwI·ÃÙÆÃÜýî&’ýéwÌQÒ]l¯c/ÈÖÐGÍõŠ2ÚîêÓ1°¾+s²9bY´!K…Y±‘µo Ÿï*Ñ>·1kì”MŽ´]ê$É8ËÆ—Ä¢0›r¼HÓ»s sLO[öc(=喷Єz“΄z¤áÓd,p ZùªÑ9©9uÒÊ¥µ»­Fu®$úŽŽ©|e¤OˆéEV:wƒóŸëÚ!¯ÄtA€Û€føq$ü¼~Jú -×ÃßGDãô-2ëàaM̾§O:ŘkÜwô÷&´»­ -ׯÇÀ­YåÔþmë1¡–Ý>Õå-›æaûœ0R<>®‘ªž†JÂÊÛ£HÊ×ÐǶ­uxhŽZ¦uVØÏêÕ–¢zf újffd?ºðéƳ™f1>Û•-$ØMX~Iƒø©«6»cÓ~>Ñ÷ßÔŒ¢ ²eòº*Ì7¸4JgM¥V2]n8Ž¾t1~×tó1pT©ÔórG2ê„|É¿t˜P¥˜€f¤9â–¼°7X0PˆébDöZ™ƒPÚtæÍ ƒ‘pM"°xOÖŸØŽÑÖã7ScRØÖ9_ÁÍ]å:aÕûÛŠâJÐx8¢*¬[»'»JIk.Ý#"|»IŠ-j4¬]«™gÊ£º°«Uïò^]7×#Å¢âýž1®×ûÔÌÂ…ÞÝ:˜LLšö©ÒÑ4ÄÜù}1…åvÁ¥}Ï›™‰ŸÕ.xXV¤.êû…5ŒùH¥òø†m—Íš~ƒâ¹¾|Y½C÷°yñ ­B«Õ唥9|Ão1sC³Ã.³Œ -e¤7$» \b¢`Sˆ‚fW¦½ÜÍÛÖÚž7»ÏK‹Ñ¿W®Å]zØÒ-ñräÛU#AÞà`0ʹ<¶¸ˆ6ýj^¤Mä6*7„ÅfõÖm%*¡ÒÝ|€oæ퇟†Æ4‘(¥,ÆLŸG„Ù¢¢>¯ò“0(—Ûÿ±bY}ý³¥â+p鈃­žd4a41\ ÞunÐüÕÈB›éx—âQ‡Ø $2<’LÆÀ¿®¯Á¥nÕ'‘Œ‘ðe"Ùé ) ¬ _¶€¦ŠõðOf ×ûmúÕ Ý’Ÿ¸¶˜B i2 ùèÂË.dÎÛEÅÞWˆ8»~ö+÷ÙÐ…§§‚‰'Xº¤Ýn$ê´zONxØœ+7úÀØY°A¸0#­2¬Z?»ËŒr•Oy|¼ÀÉnðN£bÙvaÔA4_ÍC ¼šmìD¯%e*o<°p8…a› úͯîAÖ˜¼0Ü Bòv4èc&ìÕ áÝ:ç,XºsçGÂ%°¿ ²R¨ƒ­mq‡ŸYà?«ªß51ú&{ã^9@*?‰À¼•G†´j@ðë#PãÆÓ*T>@öÙ< - ¦Î²9X¢W©Ä¢Pïá£ýÐZF$†Ì ^⥻ íW_é]U¶­]îj¸Ôá¦OãRÞä w®é5ä8ÝÝIç_üŽš{ŸÈ3•b4ØZW -×eÍ„ÒÝjùZç„PNJ xó•@/¦Œ¤8¹Õëz-¡tOž- àySÈ]Ü/2Ž&ƒ—±ŸsƒŸ#" s ;Ë{“Í>¿¹ žEOŽ Vµ„Ô£†Gìc/‚¥|åæí C^ü‰ÈÝn®˜€%˜ö–›¸ßwž^ùJþ)_â×ÝÂr¹É£Ž0!,Ç9œfœö€-ºVâ1ÆFlJrùÎp6–æ›*Fc*¶ÜÚgœrCBšèi3£9îO@‚J¨ã&bª¡ª¹’ ˜[Ñ/.× òýc”D–#ô•)]_˜éµh€Ññ½˜Ot­Á’1|úýø\ÊÏ+ì‘Õ™/(!Æ?úöÔMD}Y$1ŸáwÒÏjn„~‹,mw8âc°&s(MdçŽî-ì̦”îÒü†Jˆ6xàØ´L/LŸA)‰޷ǵ*™¤=mŽÒ`kT»¬ö¶@,¢ÐXgabN´0‡ð #¹/ |;m£¬×õAi5hÕº8‹'T†7µµUU /W•þîhe9GÔ Cº¾]9æþYNtÔÇt>“%yÂÈ o63¨¥!—~á©åÅïÄ6©µ¸h1ª¶Íö -/çÓ³³ l¢‚N^öb]Ó„kYù•8Ø!$!€íÃòKIDÖ{íü9ó4•µÙ¥óOùsÄ/ŒÇ•·k„­â°°Ëþùê¨o|1쫬¤6©³xkø‡bÖ -ÍúƒÜ4€Kcq=É LþîR7 ßÎ9‰0ÛêT—< ÖÂR.båF¸R·cŠñüs -é-zZEp8(<ŸOʯp¥‹ýpu‚PÖ¨Úâ¼æ$@›8I®Ãê¡k%Yµ iâ7£ŒµãÈ‚º=Œ_œñ:y>R¼G7o¼  Xæs%Ù‘j²Œ`Ý%K‰(± ÏWa~ËpmañžÃ8"\R_ ˜— l Çš†Ìó:ò:V$?^#†­´ zÀ¹`úáiðΫ…ÐS5èjˆŒ‰ÎbÍ -,½rDz i“ë%ŽÏŒTþè²!Mwpˆ[¤ÄÉ_CƒàŒ¹dŸî+ÐZ_ìõèž>µ¯è®Íb)¢7ÑÂë§Ò"h÷òütÒ¦‹l\VRâ%åmY.Wb ›í'ÌR&õs ÷Ü ]ºå•:ü®ÊØ$PÎÈŒ}®„ŠÆ£Å6"köG)ÿZæŸ;n,¨ôåö©çÑS3Ìqÿ(ë:8Œ@6XIh!¼º¯8UžÂˆ“k0Ž`ðùU¿‡õË”K®ü/º^ÿ€r>ó2+Np¢ µgZujúw±/~u›Þ„ãJ_Áú ÿiwŠ ]Î W2›Œ¤UûK‚¸qŠƒè6xU<;ÉVPŠ~§ë÷ò+!ô/ïÆÁDÉlî¨!v¬M>ø>gê>$Œ˪ò¶Èú̉êôpôZÈÕçˆãâ©rwo› -ºcÜŠ˜¨-íŠ4Û÷YI´ßüai¸û))ƒ§ž;k¿Á¥fçŸ1-b–°§Ïs„úÛ/÷Kx*âŒ%–÷ÎjÐ["$•aKôpMD±¯•ÛÛaêa–Ϫð/ ¡ÓûÑJay¿Yf—Œoo±¹F›N‹ÌÄÐ %ÄwsÏ;ÅåíÔO²T‰®(|±ôˆÿbLá°Y ^[8õ¾*+£K 7rÞš’2Çú­Q°Ù ú:¾Eû¢1¸€MÝJãåT^p¾fmûÙ—T¼(#–?bé=ÍÁK42vÍ¢2¯‚‹ô2 j®; -ÐÂFçOÏ„YBq¸–%¡UÔ§_"&Nô”20Þ\»AÁ1úY@¯«xNKd C”Ü߇P1‹nN!ŸèPWIeSË­Â0½L«þЦڠjõ˜¡ÚŒ«ý±džI‰™á‡h‰¹-ͳ²1u#ò -y_;¶§Í\:Ñ/D êúÿt»JqìÅ{0íýÔto–•Fç#çã-.P ]Câ¢ß¦¥–%`ðMü`qè¤úñ9¾ŠÌì§ïMX‰„†Ëó;D•f¢†^àç‚pûe -ªÅÉàOF0=æ1{ÛbÁ÷—†mMÿ°¬ÕJ%¦åEbHlQø¾ì˜n÷o•dh±û~·‘«F:ôŒ/枀m\–äø\Ã!E¢MþY€ã,”m”S»ïdtjŠõ\/ºä­³è•ÍÏ µ(œJ× šBá}¯´6-$ÌŽ–9Ó•j錪ãÇ—¦B©}sˇ!P¶Õ¯Â½¿;N ãÒF ñ½ï˜GÆ‚¾TE—‹ ÷$˜ ˆµ/tª|z©(•Æ‡è2J ÌO [ù­XŠšüîï±VS>åb†Þ÷«‰p¡½€ aÚ"ž”¦I£3ík*‡8?]0w¼ä`} ºMþŸ_Í\HËCûùs -É÷`éÅ€#I°Q’¾qùŽxHÁ¤µŽ¡©m†µ¼¡¥$ÔDîŽ$W\Ž…|Î_ Þ°ýç‡EÝfè£þ©_å-ç¡;«j‹Þ¨ ÏJØeçñº`ýt,âûÏ:05 g©âš4)xˆ¤ñ/CH»nâT²†ßÈ8Ùñڮȹ~ÂÀ*ÉôÌ÷ãOR*{½PÇÃãv>˜ø<¯êUžDÌ$qóâíaÁi”k㢠ŸyÝò0¾•Âé±¼ÌG›(éŠó:;­‰Ï­rI;^º1ø°W‰À(]¸4Í|êmìW¾ëýªö -…šU¤w%ȆÒò×öº÷üêȉýã Uûå<1å‚W†#©qL6Lír?r×{NÑ gÞ1s%ñægÁÙ@O0œ\⼎Žý1ò1­6?Ñ^J“¡ dÚÐæ9œÃÌò×}ö¼(ôèw#M>5K˜8§)Ú9V¢Å -ª{»Wi„K»íwµjººj¨é´_f-êevv žA:¹”Õ°†yèìԷ²Ò> dwÁO×â"Afðž3óÏBRJl¼o÷ãŽÙ`o*m¶‹ {*ô’¤OÓÙ¡tršIû¦ô –Ñ&g=H[€ÌûUÏ}`fß>‘ü‰FpºVç©PP t< LôôÿÍc>XOËü -ÍèwÚª‰—HœJ7%¾ª[•†;2 ÃçÒuúË“6ËË ÁÙom!Èe1?6HÅÖW1H GÀýà‘ºHÿÊÔ4AÍdµí:ìØßršH1*GäåO“¸!2Ö°›Šfç|8}ìn!j‰ç¤y¤Û>k"%Ðüùý}£~'sêÓ2çGåaUù€3Öq_ŒÕÓyMåC•C¸'¥ã~ø³ü"²$–Ggâå+"º˜­ÕS‰Êè× jO2¾k®·•)øžs! *d“É}Ì}? ^D6+Ò‡„Eõ°ü: g뽑Êf˜Xo0Y%ÑŸ¹“Á`Hˆ¹#vy´¿îŽ}ÿ8þùÍü‘øtrç[ßÁDÝÛ¸>$Š¤ë”•¾†¸ì}f»÷b®˜P¼ÖÌ_ßÛhÆÈØyƒqWZÝ’ç­ì™´¿AJœ\)ÿ0þž^ÔQè…Ç”mŒ$Ö¸7¤ãg½xÓîg8¸”NÄÎœ·¨®Ü·¡ë %^4†ZSa ^úV“àP¡+@Õ(²GCµ°¦(Æs^-ÿX{k@Xª4´¶Ó÷ÊFé9ÅlÛÜ5 ‚ÃUÇ£Nø™[ãÿ(pU -endstream -endobj -710 0 obj << -/Type /FontDescriptor -/FontName /CIYFZS+NimbusSanL-BoldCond -/Flags 4 -/FontBBox [-139 -307 822 975] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle 0 -/StemV 114 -/XHeight 532 -/CharSet (/A/C/D/E/F/L/N/O/P/R/S/T/V/a/b/c/d/e/eight/f/five/four/g/h/i/l/m/n/nine/o/one/p/parenleft/parenright/period/q/r/s/seven/six/t/three/two/u/v/w/x/y/zero) -/FontFile 709 0 R ->> endobj -711 0 obj << -/Length1 1625 -/Length2 5831 -/Length3 0 -/Length 6655 -/Filter /FlateDecode ->> -stream -xÚ­TeX”í¶¦étˆ¡chn ¤Trfˆ™afèPJAR‘nD@:$¤;¤”¤»AZäŒ~gï}®ïì_çì3×û¬{­{Ý+žÈah,¬j´ƒj!Xa1ЀÜÕÎc Fè «!]ìu°`"ÕÑP0ŽDh€±Ð;s¨=@ -ˆ‹ÄäääÈu$Ê w„a|¦Ìù…þeùí°óþ‚‹ÄÀ܇Ô‰r…"°8Šÿs 1 -À ¸  ~ßð‘Ž6€OÛÀ  E@Ѹ" Ýí\à€>E` ü$àò×A"ìá¿KÈà¸T10ƒ‚Bà¸0¨Šú PP´+ƒÁ}à€#ŒÀâz€Eàˆ‹»ýo8»ò ‰ópÅa82C$‹ á(,—ÕPCë/Xû;7ŽƒHœ§=âþ»¤?Ž‡bÁp€…za粃ìá” Ø—G†BÃÿÈpÇÀŽÿR @CÁh{(ƒ£ÁqÿîοêüêÁ(”‹÷Ÿhä¯j€c1Pr1q\N—ÛŽ ý½,:$@ ô—ÝÞõÌŠþÓ ¾ß;öG"\¼öPrQ$—À÷›²ÈnÈÿÿGüïÿo¸ŸÑÿ¸Äÿßûüwj-w°+nþzd¸WÐü~g¿8ä…€]á.Þÿ&èïŽæп„þæú;öµ*Â7a1qÐ_f8F îµ7„c!0€Ø׬?vS„=íG@qCýÓO\˜Øß0âŒøÝ}i¹?aÿwí¸9ýQ.jðÈüñ}-Á÷´þñ4Ä­ÖÄü·4ó{Hû~ó¨©!½¾Âb22a @L $“’ðÿ79ÿ‰ýë|ŒEý H €ûÿÇï_'«¿Ñh" HûßKcŒ#ìq{öOÃoâŽFãÆûçêãÊþÇùÏÆC¡^PùÔ"â””šŒ-gÈìаho#ìEåW™äæ<-E¶tžä£©éû` ˆ°×žS»¡vÒEÙ©…ŒµBR)“QûgG–°~î4Üm”Êž­PevFÍu@~8¼0.oÖäZ£TáiÕîšØiîÂìù4|'ÍG.¬Dýh¤2ãϧ¿õBÑø™“|‘1k_B‹,ÆÍ|xć=%ù>SØ›×)5)gË$\ËÌqqr8¶ÄK Œç¸ó,ºc†ñn0e—¢ÏàÖlT¹õW}-‹›ù$YÖ dlÉšÞ½I±áODC<ùÝDgµ]U9ÝYLB³ø9½tÈŸ-SŸ2Ætòä='8n”_ÖUv6³^²‘¿âÄ'åw¦cŒÿä¼Ë–ÄšQûœXœepú=ý;€ˆÛ«šÖÖ @‡]èêÏ5fXô‹\føNäG®J˜Š6Ž=¥4Z,Z˜t^>Œ¸m:[iU—⤪ª÷™}Çj@€—œÌ_T4Â;”¯˜¢íNª˜P®•êROÒü¸.dRïÄ÷€ò4u›Þ¶z™iêM“èv¥°•»ÝêžB=Ðq1nÈ\i§kÑ!O´ä¿÷‚¶÷”˜¿Í@r€^_ï×=’ËÍ÷AoåýÃR2³dà%éé¿ “6UvDå]Îf -Š1«?mýU©>gòæÛÅã"Íî;îý¿ºÛÞrJñ*“ ôùÉgì¤?~láÄçL½3[óÎÑUŸÓ“g¨_›·z²ß&ô~æsŠH§ûøVòÙõk…¨[3‡®5€tÛgÊNäLÆ]yeùÚ‘ èÒÖGôX–\ôê¦`Ö)QlyÇ:ýTR¨ØJ°Î9ýÊS[Çð©Æœû#„­’‚›9å·Ç ™ÆTj½h5Óבt¯óT³”ž¶ƒ -ÕÛnFíLÖˆû¬½ÏþbÝJâ5ËHD·ãú~}lÓåUäÇyO©<¿…ÛzFD~…µ¤¤4ÚVcþ’Gµ¯²¾dwj%ÞXŽÅ›}aö!¬‘Pº;…T¤%Zdj/¥7eµê/Lcx‡ÂY“/å•Xÿú´~äõ3èâæÍ{?ì˱‹/ª"6û¢¶«È\¢I¬ƒw òÙ|Òó)*?‚xëãoZQQžQ‡ÌŸäðD¢‘× a…·„Ú“¿w¶;M55ÅhF|Í;oj.³ûvCº c¼µ¨]šÁthÓɧ¾”ÊOçKê?¡Í=yk¡ å(¡?ÉÕ‚Ë: -¢‰w jÒ—›'€ ~+J¼ÔßlŠ÷uäI[`L»œï6äýB™‹•«3ôŸ ê-ÑØ!(8ßàêºÈcORž Å©GûœêÚuç -ßS>ºu)¥Èò"»‡±†Håé§hºNðXEQÒµ\ªšŸEØ(һДôéá­­¡otΣõˆ™À¥Wý!N<‹G7ŒùÕÕ<^°4m˪†Ë“Þ°Š¦ 'v±~µ5r³í騤QM_£“ î=@4Ņ먿P”¢‰¸“ÕfæÛ³ûf3ïbMlfÉlõ¬}94#W£î-¦L+Z·ÃÒ‘íåí:!Ë@óNɆ`Õú$AR¯úÔjU_rÁk"Üí}†”™î;¤V VÙëÌ¢“ÚÚŸ›ßïR寧ü ¨ìðð½Ñô`Ùy!ñl9}ÃÛQ¶û‹ Û2ÕŸó7K¡¿.Ï„èL’g¾ÿÒôh“Ÿzgü‚2NýÚõŽWˆ÷s}ª/+Ô¡ÕFãwcAm¿^yjåšÇϬq?"åx¤yƒE6XNïݬóB­'ŒÒ£39% ê<íÁóÝeiìN‘ƒíÚóŽ_´-ÑëSJÉعNÆcæê› I­¹à g3Žè'ÆÐ@IuiA¼Mt„ßÙɆf¥®ó˜{üõwŠšëC>:îêŠÌÃSУNÎʺ•­džÉ*¡!LÄ"굲ʹœã*öÈ>RoP¢ßžôG9‚ùíÂ÷}h†­ø—Q3QÛ\/€&Ùê¯fj'V¯©·¬ù+Í^έÛöÍzÅ4¤F<óÝg¢¯YyçèÊÒ2Í]fû´¯Ò5UMT&‘˜îO'VÃÌظ„¥vl¤ÆK®Iú§»¬]G‚O{.( I9Äõ¢Þ÷Ï¿šl5²¤´O눫Üä”y¢sþ¦ýš°Îí°+®Zbº1=Š*·ÌîÓíßaü -ñ˜Õ-Nq±WìW© h·Ý¬¦êõ0J¼¦êc«“[9Ó‘?"ȸH€‡û=꣠)'=Ï_çrc.’šãËÈK¥«ýhàƒ¨ÏPq@Iw®äél;&Xÿ–¢lÒÇ„Œã Â"wý^»2Ê(/ÂüCo -ä¸ÒÒ'I Ì;¼åT¼}9‹9;sÉJK91ÍmçJ^!7ù75t ½œëž÷D¤kg3^i,1²&ˆl׊*/ð,L"'ö(qI9~̬Cäg­®—r6–C(4. ‘ý0 þeê&Ù¦ªñÖ¤›Ìéwç]ÜOîzê<æ•QÎ4Æ+'Ý Ø_„æûÈÔžŽÆ¡ï½zC~Ž 6ü`íGmÕ «¯OnÜ -˜#¼7 Å#(iÎ>Ûbè¯Q/E×8G]¹ûE?›j7TâÍgô LüxE§Ñãrë™ø[™Í^70f¿–pYù*Ýëûözi4Ö&ü™‘}R\ž(QWžÏ"ëÕ¯™´H÷øo+y?O} ÓÎM‘ê¥s¹rçrÙN¦’<ÖæžßîŽ2p;¾'ÓIªÐhDnF·V¡®vI¨5ë§Ä Ìzì#ˆ&Ioäaè7Ò@«¶À³Æ* -^ÏåÅœÓ3VËI;y¶ª“Ë=B«žæKo¶tåŠÏÑœ=ºm¼’\†xÐ¥Pã€á.o¥ŠNÓ¾ðƒ¹ZѱW|ÌçKH°z¥îÚÑ¿,ŠŒd'VŠŠ’§\/˜ð6nó[Ú‘,˜¶d5Ý2~Ÿ[Ô•¯Ý—~¾+\ŒeP0ØRQœ) -“Ù†;ë½´ìóDQnµˆYô·½oÅ4Ø){Wõ@†Îœý €u–Òª,EŠhËREª]g'ˆ[š†ºàÔÖ‹.U÷ÜÄ—ÆjÙ!_ßn›k Î0ë-s\Í¡Û´ -•¨¢2¸?וèƒ7a -ÕX愘®ŸžÇ|l=UøeàM|Š¨Ó›vZ¡{ÖÄ|UŽl†Au/%WÌ͵գNÉRé)9m²´YnÒ˜¥˜\¿´Ó}™b³{g -Íé^zÉ•˜4mã¾Ëax—rÂódà`hbx’Ë >3}²bÎó¼+gê±­l(ù~—âH5µû:Ÿâfm3^À­é…¯Gç —Ü[ÃO–ç^¶Ã8íT<6Ïõ1~/ÊïI›¸yR[2!"Íg¨Š¡½Çîî3¼v<ëú6æ6µh^›ù”"p_¨\[‰·÷|JHSÔ»Îô4Â÷{t£cËä«ek¸ÊæݸÅÁKÞXMV×õH~ ‡ûµò›ì^l -Ñè`›åŒ­‰?®Ú˜(òa—Í 5Ê¡\ùdmt ëj"ž ypl·¿õ{²í.øÔ¶ß#èñÌáµÓæǬ -ºÛVh€/[ó[,ÎëPuÜØbÅ0¿¤Æ$W¯™¦Öm:èÿ´¬y‘O¥2>ó€ZIï–yË™¢DŽáˆÿP+Ç86‡§lo÷g1¡õ‰†ékáVî9zNšw+EŸ~Ä$½ÕUá“’g5cÝè<JoTyk:ˆ¯_2çÆn4iF} t­¯.è ·ÊøE´ÈÚº^ê~ÞokÀ4ξ8YeݾVÙ@H{yƒOê<ñJ¯5XbLcñfUî‰é|ÈýŒ_ìd„¿Lð³LY*Åá—"imžžIÞ—D2î€}µ>˼†ÜÅ­4úÍ//=Xyr£§‹æ;¼\ŸKê§{_Ïmg@k›”? `g•ÿîÎT¥ÁÂ;Pì+)¯<™1öD$D;¡à˜EÖg}eb·ú‚ ýfÀªy,V¶~ÿ£zkaD•:_µÎ.à¥_ÙM’õ”ˆµ;’¾»>m)òeOÖEƒV#úS´«<€¾ƒ·)ÝhÉ—úÔ´ûIE>%?\'<ëþÂõÁÃ=Þ+c -´;k!±÷eùo±¾¬U†RP‹*Éà'®êxGvz1HJ;±xý¼ -f£„6&að§ -³WŒU¨¹M7úC('dð¦ÎKfrIÍå,Ûæb¶4éþçb=  -Õ:²p,•küáU¿xýÖ•qZŽ>E/kû·&ÍŸYø>m²,*×èvΚVc?ÿUê;Í|y$&pPËnë¹È‰/o TÏR2¶Þ'6$½¯ÞGlýtnÌ~=çS…êZ!×iXr‡?pIðèIïuµ†PÒmërQÒÀ×¹¥;a¯¥Iž-q“©Ù“Òæ,¡*:鯦›Uy¾\§oø’$üùõgVÂÎý5†û®Iq!1i›¶uðC{e ->©åݾugooî¹mYGM¥Ï#¶¼dÛxíÁ ‘Û \û;JEj¼‡Ùj܉K% àn·:î’ÔŸú×ØÌ ®Š  ¾]Þûj—.¨%—¶« ­I¤ç›{œkéî¿czút‚Y×ߢTÈ·ïbÙ«ó5!a€Ä­bŽ…Ç1%Q¦×3ecs6¢CHC„ÎÅï5ž!ɹød6üÒ:™Ü¨ÖŠ¾ -¿{žgdõ͸ fÊá)3÷¯oÚÐdyí¹Çù¹­(ZKF¡‘‡½E€ëW€ÊÄUåzïÃÛdçƒw,Üóçœ×ËÂWCìV‚™•íÛ)Ÿ-z?n¼¬3øl, >~:¾mÿ`¾0:Àf&•>¡ÚÕ8 l% ÷å-2Ѩ+uÍ÷r’aÙ»Xà1h°ž­õícòÿ&\uèÑ£ðbŒþ6—Ívq|š_÷fœ\â)õŒkíý!á ÷j0ƒŸik4I¸ï8OÆÝÉFgsNLÇ/elŽßäÓhÿçcÍy&…M´/¶>­~®é)5aÏÑÖ C! Ë´7ŸqˆÔÖJ"CErßeQ;[&¿»qwEã;3Äõ(Ä׺S8 ‡'³®½G7“=fùgú˜ºéIT9®ÿÕ‹_ÊI·˜<µzEoE9p$rÇ×Ãê~xÏ-"*>b8OJqÍ;ú¯1ãœ1Øy]iyælÒN…z!¢W( ž•øÂc)³ôš¬}a¯}ƒ³¾Ouo •DPey/¦sûÜ”66æV‹ ²ÚTT9_1‰Æ¦ ‰0mÈL%xTø/WÎ44þœÃñ¹€dòö¶¾£³ðéš_›cÖêcXšÐ@›(µ‚ϧÀÊ…´¥Û€ö¸Ì)Îó¸Ì¦C×tå©o0Jª&øn¬ÍGß" ;ÖGŽ0fwÆo‹Ù-ÖèÝJÈÕÇÃu5e®ð‡è‰áTzýŽZã]MK -,¬‘Äm1ø`q%nø© b¡@öÓ»ˆd!•0øåCËÙÀa§B‰*çcø¼ ¬(yãŠýüD‰z9X>\8 ÚVàFŽ·èë‹Ž“qiÍ«\ì#cR&­€s>>×ã*Wkòù´qM~¡Æl{”÷è7v+NIÁö-ÓžŽkÙæ¯l4íÈœ ÆîsÑC< -á%6×ã^Ïë7FñG5 š¤F%¸¼{Ë f73ÚmíYµûzÊË6uòˆ¬³wXÏU+×¥\—_tãí1ÕÀ¤X§;§N«bË~8zžiNjœ½<âšJ›”z1}W¡iò 5x)@HwÉ6¦ôé‹eš¿bŠvE~X-{(g;µn\990￘ã•ìé¥Yëy¶í’ÙÁ-Êðó ->RÐ/kDpSrdÅìži00'C˜TMvq¢¥5õÖienUI˜+òìNGñ0Ë$ƒúÚ·æqóˆn1M {OÕæ4 ºJîÁB¡qç“ú'°Æf1ʱ\Ú\z*ñ]‚0PfV²F=U>Hí'mEj?)^¨jy†Œ”Iü Nx– -endstream -endobj -712 0 obj << -/Type /FontDescriptor -/FontName /NYWZOF+NimbusSanL-BoldItal -/Flags 4 -/FontBBox [-177 -309 1107 953] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle -12 -/StemV 145 -/XHeight 532 -/CharSet (/A/comma/eight/four/i/l/one/p/r/two/zero) -/FontFile 711 0 R ->> endobj -713 0 obj << -/Length1 1641 -/Length2 6434 -/Length3 0 -/Length 7268 -/Filter /FlateDecode ->> -stream -xÚ­teXTm×6Ý’ÒˆCwwKƒtw 3 Œ30C#RJwHI)ˆt¨t‡”„¤ˆ„tŠ4Â7zÏs¿Çý½ßŸ÷}~ì}ìkkë\×Z{q°š(ƒN ÜK@DPX }ää2ÂuT0°*ÖöÂhP‚ˆƒC zAp5 D`Ô €¨(@DFF†ˆ ŠððGB]\½ÜfÆ<||ü[~»œüÿ… #QP8€ýá!<Aà^hŠÿq  ðr…œ¡0@ÕÀÐJ[_À­©oЄÀ!Ht†ÞN0(  Aà(ÀÀþ:@èJ¡¿KC ¢¹”Q åAÑa?Äã7Äð€ AQ(ô7Š¸ p/ôx!P8æ þ-mwFüäD =¡14™!å…!¡^tVC5¿tz¹½~çFAÑ0áŒö#@Þ¿Kúƒ¡iШ -G¼ ~^¿s9A`(ÊôGçF“y ¡dx£ p—¿ð  ƒ Ph4÷ïÛù»NÀ©èáóÿøãõo P/æ,H$"ŠÎ òBçv‰„~Œ6ÜþËööøæAþ¹ îß3Ã#à0âL$¤ðB§pÿϺ,øŸkò Åÿ‘ÿGÚû¿kî?{ô_~âÿíÿüOj oLø=-zÓ º€ß»ð{Ùü ü^9PÐÿ |…ùÿ7áÿt´€ü%ù7ë?±¿¨•á.èÞÈÊüe…¢4 ~°!Ô ä -pÂзöÇn†V„„Aátwÿ\,@@DXø˜©+äÿ݉¿ üOéè†ý.¤£¡n¤«Í÷ÿÛ³¼ ÑóàeêïüßTzð¿¿¹TT~€@q1€€¨Œ4@FD #-ôߤýÃ#ò÷Yè…„úl„……Eè÷¿ž¿Ovÿ Q‡ƒàßd℃Ñ3÷oÃoäD¢[ýg  +ÿ×ùÏôC ~ÑÜ4$î–™åUM›ß7¬fÓÕ!‚ÝáñºÎ´¸0¤Ñœùì›L¹ãuU„`ý¨ìÍÿÏÛ¿Öò~è qµ§Cö ˜‚Øx: )9›¥ø¾?²}'kÇ"6ð`Jw ÇZRØüûò°‘±ý«k¼{£ÍbH‚ƒ3ž6ŸÂ»ì§¤O@µ Ô-äõ”ÕEÛ;œ)›g§\=ƒý}½íG¸kŒ|y „r>8w8cB<ó•¬ÍÊckÚcG:¾Ð¿}¼s1£IëX 2`¶;6 tÜòMÞG>@¤AùXŠ×8E#€Á:¿Ú(ìT寫‰Â„)FyÕ:+o)À -ˆ^þ0®WkàiÀ¹ô°ÑpŸ ½#ëÓ󟉅cÍÔN_EÞžüLjçý8~ç[öúaÓ°m³{ßlKV<Þ;%€ò¨[ËœBõ{ézoÇ°ó*JPdÇsãáàÙ5»§(_m×ûfÉL*f„wÊ„˜›¶o:`Öbˆ¶iì}3+ÎÆÈ[}µÒÝÓ$¶YAìÉ_8qC#_-ãYm|«t¢ïÑ à;f´-ÿ¬Â¥8Ä•½Ü;Eº(Ù'Œ.*´ò -]æ¤Oª ]%x¹~v¥Ø ÖX#î`ë”ïwrÒs Œ7§¹9i'C^æ‘J>Ì)è¤å 'ÿšØGxó§q²D±BÏÑo·q–å[q2ZÎÊs× pßbLbRH¼áGÕÇÔ[>>÷¾ñ\‹Õ§O¶OGM›áíHz­Åœ®ðLî×'òFŠ¿%1?É~ö¦·&xT$?seš»ÔWºIaØægyâOü•í' P‡C‰>`¾ùLtÇ3›!DX<”ï4‹#ȵӆ OqßM·$¾äª^=#µ Z!qz×^w%;cOª7—6Ýn©g_UšPùÙU#”Õ÷š ªü²åðS¾™1)#“xL¹*‡ÿpQ)r<અ¶LÁó¸h’Åðn* ñõ.Ž‡wé:³ /8}>cÎEÛù"89”àÀqŽÓ¼`eÌÇó{틳sÝ,î¶ÆŒ§|÷͸hê]¤Ñ6>µÛk>ºsB7¡ -…ºèéú7œä­hez–Sã¸Tôé9M 9ÏöéÓá|s·¥pÙþæ5ÕÅÙÔOíÛí1‹:5CjÿÁÖuö‘“5*—Ì×÷¤îb®8ƒ³ ¤;$Y¢4#bn»»>WïÚ†°e°òr²B5Q‚ÏËÀ ú»Iw©t®ÈÇG¾$0%ɇɈ -y®fÇ[çˆ:+#׈…=J½èô®¼h•P_‰ËÍŸÆëQÈž(„L òŽ§?)MïHOÞÂõÃü¡Z'ÑPç©+BÃ!¥t&Ã1ëdl[²ž®œûÉB"ù"?D’}¯džlæÞ–)×:c¶ –J<°Ú¯Å¾›ª‡‡ÁÓY¤ÉÈîø&«"`þS2?ãö›¹:©ôh¬ë—äùÉ„¾qÒ(܇‚Ä^?X¶´Kî¬qJ;¸*äq‹-žž¯Úë_d™¬¤h5¾æÁ¿ -”2Ò÷«aˆ¸X¸yà¾Y¬Q«þS?UwV#Êòõ9ïQ®áØÑÀú˨f`§R›ƒñ–uø£5É6ÙÀÇQ³ÆÇ‘œ·b¡ÌÔ¼û†Ã|ÝP•Š¸tôÃŒ¸¥-PÓ N—ãSêc˜ -Šô[Ó*†ÎÈ!o­:`âÄè²Ò>šPI)à,v™z¦¹Œürg=£\€Nåqc¤j–#M:˜øa“FYçp¬@5†šâÌQâ<ì c‰÷µí³Ù›¥žµÁMä0b®`á3^5÷ApN®¾ÖÞ8¹´\†RŠ*ÐÚŽî—ø†¶ -¢pè~ ûœ©»eÞüóŸw³V7ù줯~¨Ï4È„²"6sKµ.~íö9êiÅQóAµevÆhà÷¶üˆŒJOϵn‡ Ôðø2î[×4•›9¥ºGÆ%µqzgAÓ£uNÜý¿ŒÜ²W>Mà\¥_’øº;8rm+}†»ƒïDK©Fp©ëÌÜ3äÅ!©Ÿ©¼ßsž\x˜\´f+ÙÚÔµŸ*á|Aûnµ¯qÖá]¾tˆ,4i¬÷ízè$(ŽZfêÃÞä%¢bpñ~­3+®Ø/;Vz;ªiŽ !=]¥÷ŒÍÙèÎÊJ6aÌpqTL¼Æ |ê\ôb–"ðØõ½x ‚¸:29-ëå9£j¯í³¢*?ÃëuàÅ„Y–Ú•ú£4Z^Ž»c$Í-FM\éwá*Hê~¹ý¤O£5\Ý¿ì°Ê†oäÛ°WU“ É+ÒÇx™ÙÄþ²§\±9c4/Ülêå?=.hüƒOAûefyV©RèëØIÕŠ«öõd±KæÉ…w¡Ÿ&mËúÚ§FW«@Ŷ£ŸVC®•~+ÅHtNAö+HÔ6•á€Ñâ‚ÁªæÈbá(Œ~âCØöjÉ›)ÙùýÄãU{†v ’å!lûÚÍÁ¬Êsž”NÏWÄLYF³ÅÅGCâj¾3¯Œ€R."Å¥Œ§æ‚£Q–pìÁƒ]$ÜξQÜÓب&¿IÂ@{÷ôÝ¢ä@bÂï*œ8ñùÖǦãU•Wጠ-Æ8*’óiÇþ<ûfÕ¢%W7VIM]fn[y±ùsk‡l5l -7<ð¥V>&‘ÓgÞ\p±Ösõý ñ'oÜÙ¦Ô#O…q&àDBÝr7¯gýA?›zõ¿±£<çà”ªdš”w~w'f -¸g6¨¿Ðlm—¾‘X·~ oŠÿ’·éÂÐ…nyÎ|™CÛ£ßãëObí}@ ¥ÙhÑY¡ß›;o¿_¸àëG(ù%)!bñiòÇRåÒ4|Íâ'ëÑkç·çz­í^]•sß,ƒ¸Rm? kZoꆜ|€¼,³º=±Ûÿ¹ -þ¤Ì«Í®syÉ6“™–JE—6ú>nÃSI)†zaÑoŒ{õÕú±yj~ò³‡7×¾mJkÜóõQâP®(t±¯1€<ÍCN—>0ÞÉÛ‘×_²§øHžySñï]æQâ&F1‘ªV®îËWÒ²Ðôûµq„’-s4t=cbÁ\0K¢ªõÔËJ9´9zæWc¯rÝgÎI–¢ZÓQåb Ùò増¦—åÁ¼)¬ê}ˆà}Ž]¶ïKXE~ Éêæ¬Q°@Rö3Ð ]ÐL¥qÔ!`Û¾a´:ÞÇ”RSX¥Üü^Üë™ÌGdïoƒ"¶æÂUTžb”ÍÝþ¹ŠE³\I~ò'£lF'ïžÜ« ÁïztÅ{‡E#BzúÒ-yâK}~X&”Ur ÐmÇ[Ñòkú}ˆ>¥´s×=Jfö½ÛeéW+9‰¬‹"–/ß2j"ïÚÖß”XxÉ»Z½DÂx¦àŸOG´ûf€üeæ†<x[ -]·}üˆfÛ»¥en¿Ñ3fgÖÜVªDðxXûn—ÔãÖ¯ç'QзÙmF¦íÕæÛLcI&ÆrH}Ln‰oL“w„8ËþK,n/ðˆîB­-8È Ân4·Xeu0Ǹâ2wöû\TÚÁ@jÓöxÎ2rÞ¹õòì‹,Ú‚D!“5;kÇRE£‘#v6ÑàÜbáu­RèÒ÷ÄBNÜ”E+Êr™8Æ”o§ýí B°¢G~D§S~éä›-n¸WXáP©‘jñ2ågN<¦&Aê$Õíð‡ÕåÙ2xØ÷Z¨w\ûr¤ME%RýŒæ#oÍçuäJØÑKáZÏFi§‰»]8RöŽ{VæS†ÃXÍ»Rx”ñ¶pé>ˆÁ’Ÿ1Ó^™báGïõþD4È•p¼N—S.F¢ôˆeý*ìT­¹o ¶ªä’5bLØÕ5嚢uMH2ü 2÷ÿ/GÊCU”ÜET»ü¹Z63át P¬Žiã úÆçˆ)êKŸÓúôË«MþU¼FxƒG2Ž¼Y©)~­D|¥dúþ¤Ò^ª -1çE¡»£7Wc™ïå§÷âõìPߥ¤>#&I›I~ÀömP0¸Ø´|ÏIlË/ˆ©ö46Æ;Àµ½Wv)áÙÌÏð‡ ÅÊúÇr,…C~H¥zb';/ºÒä±[ËJ¦OG<=K<µBϬžuãáÆψ³\ÌH/Ì|˜ÓÎÇi™¬¹:éˆ$Hp”Ú¹Å~,½¯-ù) ª²6ÝCôTµ«˜[Þq û ˬ¹Ð³øÀ—û†«·,W¿ž«ˆ¸Éãi -A½Œ$“íÆOVÝ¢q·Ûïi^ôجìUX’aàÚó¼"0q1ÓÅWÑ›.±ºøº£Xà¹õ¤Pêkc ær¯öYôå;A0M$È/•{>˜H’ºÒSúd1ûÑ`ʇ+©åÑ­ñøÃC‡„÷7CWßãØôÇ6ë#FñÎï9Ê–.÷0}ŸŠ»³úŠ’3þ;»­šÒØeŽg4fƒbO‹¤9&Ïj¹õÚeô ïAOü—KkLœÚ[OäðKU@þ”þk­L¾Q¼ƒvƒÇ¬,^'¦ RöWàÍPÉ0¨¡åMÄñIà]y¼>^T°]êU‰hF¸î 9û]ÇeB½—2ÃÓŒÖòèL -"óžæ“>-°ÛâÛgmÏýÙ½Ç|ÏË[»9‹»%>ì,RD5\¤ÈÛó¡„„Ÿç–ÁäGž+YQ?&`þTf-µ q:)Ía—v?‰1:Ë ò˜Ø°·N¯3o;¾žx¡®<àö¼Á¬ C]÷øAf¹£ÈiúSÑéúî&ÝLsPÕ.`Åý¼S¬› ™Á]”…¥Ìaë¡/£€„haïhˆ\B-zxÒ!Òzº>ÅT·ƒpïΕËÝ´?—Çô‹†öćêf¬ ³’`é5(64k¦iíØ(Ñ‘? ìÝ.å,úºáªjåm§°X}×Y?¢&Y JŒ7h:/2©dH³3{ úVÓņå±Qn2^aéÓáùÒÓg‚\K¤k~„ÚÂä“Ýnÿ -îŒÍz0Bç^y+Q¡HH¸\'çÎË\ã”Tü½w£Ãj3á2ƒñ¨T¡6«"Íeô0é SGntÑØ{«5aÖ<'œ7å†f‚þ >,cŠ¶sŽ IÇVüö4›¨š w“'|¿œ{ü£®ŠWåbñãT­Ã6ÍJÒ”çQñé47Á£&±<Û_¨PÝME×ï\Ú®!MsoÞ¿b|A­y4z—’£ šÎ<Ï]"Á¯ëZž“9ÆP¬êª‹Ka5ÛD–<‚T™ëùaQs’±Œvg“Òöò=ŽJÔÆÂj·…P^/%“KÏœ+mZ3é…Å"«ì1=s’š}Že1y§¶Ô–{n{q€õXšÇ52ŸÎJ® ¶ŸU6žß 2„.>ªãu\º’sn–›¬Ò•lb°,ÃÄmëÀÓ‡÷Óâ9{_|M5V[mVgȪ¥Ø/gɼIã?„ÜÒçA®WŽ²,ªðóŸø»¾¢oQQòÝ—€žô­‡wá<j²÷Ò¾ËåÍø‚º]€éD.¢Ëzº…TWÁ³Á<ãm'þFE‰®·$³6Æx,ÀÏM:`bŽ:FáùF©Qrz¦Í<èÈÙÿ¬¾å‰Õë¸ü¯“¬EU)R÷‚Ýò`î3ä3/Pè7X¹Á8šÅý¦úX{긛B…DÝ6ªä3(|7n¾ÿ#¬¥ÚÿNJu)¡ ­ÛØ@o1ö½vÆ€üp"é5WæÇÓb¸îýAie4'*IÖ×»´~ -jÃÙƒ%k²¼(Nâ¸Tüå• Bˆ ƒ—äˆ-Œ1ôQ~3ʯ±ÅŒØ_8ÏÛã†(MB‚&jL˜FÊÝÀÈJ-!ËèRÙh1²ð¯g¯Ïäm¶r75ãnõ°†¦™JVH™®qúëo’½J„ïÊiE=Ú:`b¯ Õ¥³:Û ¸÷;ê…K‰ìŠã~Zã“pSá·µvÄ?ºx”¹It2@BÚNÎ<ËÄàc²ºžÇÏ0,H× ‹(áÌU%e®øR?Ù;Ü’ÎÌ"x†U]ž„HúvaßN¦œ&°ª0'/Çâò/ötc¹ðˆll DÑMy ݜڶ*6~}YôäÎSìûJ»ñFl—m3q¹þ„¸¶‘G½ñ‰Ó–„áë ‘˜ý,á'ûƒÚ]» -sܦ©´çÐqòS≾\>ûµ ;.­wå+ŽS…Ÿq¥øí5™¶CåH?÷í]~¤¸7úƒï×.%¶‹³N©«=‚]è u^€§ŸÊÁ€¶`‰Õr‹ÙÚžlQ×ÕûîniI8‡6gÃè§.µÚƒ•n=ç³ï\šjª-BšíçÜÓñgé¿àuÄ.^8òÉàÅŒ®4hÆ)Á3AX ^e»½¼Dºo6`¦H gªÖö<ýżÊ2>¨ ˆÜ|MWDÚ»Z1“ Wª^/cö§”j“Å"7YÝJ'7C—|Šô' `’_³¬L%ÑW IJfî䎡i>ÝåæÏ ð !ìö·ó§ìÉ6«óû¾oB¿\źò²nâ¨5—wîrü´6œ8ÎÉé -&È9ü fÙbmaÖ’ÔU3ƒÿ¢‡ÍHL¦"؆žæSðËÖ _£oôCGmZ$í˜Xã+³oO×,m+±…²>±Zà…otÚµ\ó-"§ïkY'º›6ì50ÄÓ–ÓzXÿ`R‘t¾±=&— 5“”´!‹!4óO íÌ~ úÝ©z„ts¹MbŸ×õ‡&Ÿs­|\Nº© ÚܽÅö~³q,iú}Ž‰l* ´Ý›ƒ vH÷½ÅÈ]Íâ?¯Ø`ÿvÅt¾ƒ™gqCèF)V™@`GÚÆ8}2:º-iŸ(ºQ÷Œ™„üä$Ÿþ|±7=°`8ùZÒý¶sŠ::Ùg?~'¡6+•1 ˜e$à§ÆÉ Uoõ]±iµOÑXqSQ˜Á"{äVýºØm·JVÍáeȾ“©I»%<‹~d–l~4¼u½µÿñîš&‘ǹ6Š)ÊšsÆ1=-ª=âýX™™ÉpX_i,sj)¦fv<$•<ѹÓBSFä´¬¥¡_Gà}øÙß Sþ1T¹ŸÍ$ô\ß·X «ß€š8¹[•6„ê¹¥-ßÁ9°»Œð[}ªëñó‡7sMÛ¬ašÍ~ù2ö)x{] úÔ˜{Mr–Ôµþ‡‡‘¸w>‡=æ6‘$.x%®T~¢AL¡¶s{8Dµ/ã]ÑVó‹ÔÁ¿Ö0ºÙ¥Í÷ãrÓç䇇j/°·¶Cã@³2ðê62Ëu|7TýV×b#b¶ªƒVWõ›þã/ÆKª»/Ú©Ycâ>›á‘ëZs}WV_Ûb‘ïZQ\Â^ŽÞÈ%Ý=jÞ£¸¶m’‰šIH7fø%ÿĹH.îGâÿÎVD îT´QÆE‚„ø;ñ›jÀæ… å]2"¡I›§ïzëAl\Óα€+ .츪w}gü™îŽ–Ï8‹ó£ÔR)?Uw, ¡IT2P0o²þ:D°;åßøŠÏäÈè°Bp¶Ô 5¶0+L®TI|‰ûÝAk[}¶ÄÜ âd⊱óP6)ÙÏ~µ½Ï²ÉÎЀgšŸ8P&ÏÌsÍæSQÓ h%3LdEý?Í ®Ç -endstream -endobj -714 0 obj << -/Type /FontDescriptor -/FontName /KFEQLI+NimbusSanL-BoldCondItal -/Flags 4 -/FontBBox [-143 -298 913 989] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle -9 -/StemV 120 -/XHeight 532 -/CharSet (/a/b/c/comma/d/e/f/g/i/k/l/m/n/o/r/s/t/u/v/w) -/FontFile 713 0 R ->> endobj -715 0 obj << -/Length1 1166 -/Length2 4511 -/Length3 0 -/Length 5274 -/Filter /FlateDecode ->> -stream -xÚuVuXT[¿V@i$eé:%†î¡%”˜ÙÀ3ÃÌÐ%5RŠ„€ (R -Š€„t(’Ò]R‚ÞÑsÏ9÷;ç»Ïþc¯õ¾¿ý‹w½ëy6/Ô\TŽr´QHœ¨„XdŒðröÁš;! EÍW”q¢àåµ@à<ÑB8á(¤¦ŽÀ[¸ù€Œœ0 I0H¬–W”‘ ¬ÁR¢0Š (á… -A€ñD ”& -æã qæ>h´'€›X”`A.„Îþ]¤B`®n8€¥™µ °°È߈„‚‚È9àO¤ `®Haá x¢Ð¿*RèHChþ+êâ¤Gà~ pÃáЊââh'€€‰a]ÄN\Ш®òú•KñK3M€† -ÿ§nH”2è_°  ÿ=Ü-n‰DxûzšÿL€(þÆ\H, VK‚oàsÿUÒ" ü&%~ÁNHxH…¹8yb„ @xQa|ã„ý_â?w 8†9®„cø;;\þØ9á0X –=­nŽBzünìä€ÄõnYèj ÿsö¿¢ !¥¨„œ4HTR^†àBF©füK‹?uøBÿÛ'øï”zHHáq:þ9’/€Á¼ ømcAÐæ7Fá0$ð·uìÁ2`‚k/‰ÿj©ÿàÿ«±þYCÛÇÓó·*È"è‚~)âé„ùW¸“Â3à¿|ðÏ@kà÷ÿ?yôpNž˜:ÒÕó/™Xm„?‡"p0·?ìò§Êðß÷€¢°ˆ_7$*!#ñΠó@X,á,~Sþ’ZH -Ž@º‚ÌqW:aà¿h˜Cç÷¾ýsï‚ 4þŒblSŠrõö¨RÍOt±_ªUÖò১4E‚çùy1¢cfglÒ¿É?ÈÑ„öº©”ÛŸÇ'³i%Èùy(@ÄHé¢é‰tcY7Ī”©vÈ>|·²¦ÜeNÏ]ÕèÐÝæz~`ë¢ÑGoŽG1†qÙ.¯x›\d»ú¼ ŒÜdeDPé$bËD×3ÔTñâPw£&Ø=âN:¥~ÓëÇüú¶”¯7Êè‡GÚ Ô2aCx -ÜËg6›grŠ}M’'n%õ.'•Ýè}©›è ‘öPüëQ·åWwÇÞ -{„Ò]¼ßþ4Á“op–Öä"}¾–J$z…䤸5 „^Ùü ­Ø½ Œ/²mÄO®æF)ì¥u=¤zn;×M -NuÜI/¹ÓÀøŒtªL«53.ùI+„~ÔxÐ&•Ht¾£òÀ¬Ræ,èØ ì‡Ã–sºŸ­îÙ -dT;£«ÕRTt.ŸÅ"‚Tl¾5 ç— ¸€y¬ŸÏɱ!Áæúx’2¼ ñîߟR²Ù"3K(¬&9GW -²ÛLuxv+RÝ`y*þBŒ|üÐ*™DV›EqL”ÇmOËóüÀ ½lÙ¡±ì€A*oöDþ6‡SÙýüZȳX2–A*›µhöÚG±]wNÏ…Å|3¶{gý™Õá-‘jgëàõ±c±§,‹à-Ú[›),­TxнíÈpx“?3·ø#”7æXõ†Š±8rX+4¹–¨RÜtØ —²’²tg¿8Ÿ¬Ç¡Ÿ*WéDGBl\Ù\ôzßY¯ÕÏ%Ù‰‹qGÈS?!q¬ã´ëMIú–„NËùŒî~Aß.Ó Õ/È õ¦Fê2ÌFÓ&÷/jT7gÍ®ÊAÖ2Þô¼'?m´¹µ1¤Ý Ù*"¢; yK×ϱl¢ -í(Á…¾,©z/ÚØ-ÛmA57‘"©${`‘=‘^¼3É~Ö{-¨NmA]Ôö°dÜšlÚ}¿×"¨Ïú:\w’¼)l÷ã ²çBå ©™…ª.Qtð/vE®ì‹&dv%¨óèˆs±'ÕãŒB¯wðm6 AÌ–z,©–KÐs§†»ÊF„0$š>g -çñd²˜¡—X #+£ÁÖÏ6²—y)Ît~+p,Tª2s{ŸLoï£56œkÊ¿S–¦_äµ:Pˆ¯Èé‰h¦ÕÁiT2ÔŠ‡xä;õ˜DÊü©8X¶ÀLñZ|“cÒè—€ÎWSkºZGNÑWBX=+»€¢šg}%“/~¸.…»~ûˆ®œ\ž²ê#äq·n¾Ÿšt¶çõy9Es3ï§Y1øÒcl¬V­‹ KK}ªnôs¶0¡ª+ÞO˜øö“…÷½ÜÚ?¬%Û/x’FöŸ=ä(6ÔÐyÜÜQýC:{¦JŸ²Ø:þ+oLp|Á7æÀsfåny‘=âZë'gRÍjjó›E4ùJ‡Ît}xû×4HëidsÍî ½õwë•"Rj‘Y8u¶ }©èqâ[V®\{ü°> Àø‚õعèÏÍ(*†³xUô—¼~v/ô=òÏ‹J½¶F×4ÖI»štÊD¾ß§˜Ô¥·À.Ÿ j 6ë-ÎkÅ唲°%’ŸÊ{™ô«ÅSGsÄÆÕoˆÈ2s´£²ÎÇ$Ý.Ü[ªHHK-Û^gò2x›D铤±ð‘r;õËõ¬—LlZ©1¡î%b?ùÞô½ÊwÈ ’qYÝ3ËL©‹¨Œ§­¦fY’jqõž_‘ÉõÅ`—$@fÀŒŽ¾ÃÖ7øfðî\ÂV­jWø9÷©ÍÑL“ÝÚÛ¦ ©w'œÎlì¦òIA¹å¢L µþ=™5}þ{Ó>Wú š?’¹íĺhy?º zÃ@4±úøV"u®ªZ²Œ±• Ž~Yø`šüö”д}éŒTc¸k¥Ø5f%yYìkßÈLæ»™Vx.ÃÈñhY³¡­©•fÃÖ—ëÒŒÚ@ñXŽçþ×4ꈜ‘-#ïÍï)F°âæÝ\Xv“³Ñ`o>î`åúYn º$íT§æI³«¬jsÏÒaç`}wN^ s]šY. ,NÄvZc_ëf)”Œ)ûÄ\¯%UŸ¿‘¤'ÙnÀ¯,é ¯|$oKuA“Ýæg[Hܶï些ˆÝ`ri)?÷‰ÉÞÄŽRAa_2öǸ¨>"¼®ùN>Ú:6ˆ·E‚ž†m›ã 03gTKŸ,lµl·3–|ÐêrŽØ]åc˜Ýhµ‘~`>¼ÅÜ~Ù¦ú[UóƒÌ4?¸°û^’ÚüZ¼ÆbØ°[2àu\Dù0‹T;×ònõ÷bˆ²Û9‰¤ë-(0ÙŒ#»Ø­Ö/:ª ›§a›£]9Ÿn}™B¦ïÜ4wçEw \&ÅæE%N‡7Ž(ÓÜ`êü”1Êh˜Ëæ²a¥Ý2j’Kÿ¨ãê6qË©ýņa¢–F⪳gdvÉ@~–Ú’W‰Ã3þìØçäÝ÷ßk¦­Ç`¬o¾èŠìHiHYZÇEF;Ów`ºh%&2iæMâ/.4Xè»áë}èènSѨ<ƒp2·óØÏGûAÛ9XqÛûÎõÎ3ü˜û͆_¶:ìŠgª6£¿1إѹe:•l¹6p^MÊãÞ4LeW˜Hàv†ö-ºOY6ÚÚþœíù²™úïÕ8 ŽDrcX’·O’|ôÖ>ººKŸT£9nsÈ%Êœ©\Ä8›¸RІ];ÞÉ Ô%bμ}‡ëbîâš½îøðžGˈ Ì‚Ê¡½Ò.w ^Ùo«”|yÍKšÉçƒ(©Í¨š`Ô­ìeycušûÒZ¯M¿¾æ^¶iìOAXÏý:óñ"ã3޹Ÿ?Æâò‚ÇÝN_|y¬_úÆË4-3‹¯ÜtÒØg¯BÄJ2^óãȵ{Ù–(%a6/‡†´m[÷ŸrÈ¥(U‹±ö…Sõ±‹ê¿ì}‘ ]ÆÌÿ‚4cíwªšˆ"ÒGÈEìq}Ü!kI}ÚH£‘A©¬Ù m÷*fè•{Rÿ( â]ǘ³Ô¯Tã²ìGµÒ…6Ó·äàãVOÙ«˜Öb¾©’´jžŸmV¿oÁLy"D×=Ù_€âGøCGu¼oJŽrÞ÷¨;"ï&ÈhL°Øu³sŸw†]xô$VÓ›™±‘!øÓøð*žúµ¤Dx†Ä;A¯õ€‡3³(¹R…‚K¡|³r%¥”¦4º]² ï£Œ×%1)±·~J †­BçÛŒûÎÂÍŒîVO^_ø!yÂPC¹ê“Ë Q™1 –Qæ1ÅZ5OÇgOÆœqµ¼§uª#Ïëï=Ù<·¹ý´__Õ'¥C„KAæ˜$4`eô§SÍ0?¯uÜvëTݴøãÕ{]:œÓB5Úl0’`H6pf¯<ý¶Ÿ$“¸ê8a ÄõÓ‹\±û^gZ—œvE=âžpm\⤖‡Ö~¾JUpól¸QDP[qsŠ©Ìn˜^o×s‘ú¡ÍÐuãx ¦kSb«Ý Áõ;Ô— -¢>’ƾlº¼Vwë»x³‘ç0}!|g£wtÀ”~¿œ§û©Z7Ö$­¡‚’ÂTü‡9Þ9ØA“ 17[ïvö¨æíŒe|per>qHùê€ÅÔ\É¿I A6“jTŠ†ðÈÐŒ0œ~âý1j‘÷U­ªk®8·;v˜‹÷î`oPº;ù¬äçø–‹4#•8Ý­¯ä«Ræ¾òÅä d[øÀ+´yÎ}5N ìOž—Î997FaY ÂÇÛ£‰Þ×XË ¬iá»%v®ë,y¼,h -^Ó>¡š 9¬(4äà¬lÌi5ð"¾ZšÏÈBD“ô×®³®<È<PA|©Çê'Qd—†¿2’œróÔHû(]©&Þ¹åÙ))ÂO^äØýånœõÉPëQ¢‡}»:¾4Bô*Uó°)å‰UèÖ9ŽÉê9VagÞ½(wná¦)¼ú&îsF\)Î -}Œ+¹+X hÌÌ@SFöWY-Iô›?‘L¬2Èãi*¾Q`0¬PÈ;†þ)$ŸÙ%ЦS[&è=çjöW‡<™å Ïc‹œÒ¢žM.29ÝáýÍÎÖÔa>+¾­2½Ä×ïD²ŸhD^šÞ)¯e ɤM¹²¯(•_ )Ò[ëhñOö+Ͻ§ž¤Šª/«¿|Êïú™*vàªèRÙÕêt;Ó`G½+­WU^ÅÈ£wêû$jŸ=Uuˆk£º›.\)÷ -ûzŸïüßÊ[$ª/½c—ø¨”X²½kÇÝ£¸Ã[C¡ò›º"üoå¼Ü/èª|õÚ”ó«ÄÆ[fžCª)†Ÿ²ÇÊ \”ˤÅFݘâD‹=Ö…) K8) -æ*Ãàì“G¨wùAÅ)è·7Ï–é¤YdϲžÞy ˜ŒáfbºËgõõþK®Ûø‘Ç3†þÕî=W5…{ãv»BMÛ“ ªBS&¥àE|µ†yãAŒ烡*v öÂ2”š/fƒQd«}X â5éB¤h‹NHÏ`!{¬Àà«w‰Ž¶=Ù:x+‡ÂJÄ\¸\Õ×p©Q$@“å¾ëíQø‹\âçém§ôî®íØîX“½ÆšÅFHÛîÉ7ãp2[õÄ1](§¢ðž«œ;5ëØw,'îCŸwvýS´ÇöÄåXýäí9¥·N¥¢&chÆÚCÚ@¥}r#ûÅÕœ:6‘²'fGN¨ÁBÏ&æeÓ3>;­i_ðbä‡÷n«æXîf×<ßǘ¬¾³[hA·Ä+âfòÇ8&cW'üo¹ƒjK¾íF>“ U°7< }pû˜Ÿ¦w˜¦®ŒQ ðÅù~Ú5:ÝÓÉ!2¯³÷aܶΗ3á?•0wÈÚÕ*yäËÌæð6ÚðPí(WÁÉÑ[#NqåKÃÝ™ª ê;3¯ÕÝP+ÄôîíÈT°Rˆì1âdÝ”™¹×>™¾YZñá)_‘j~]´…î6&Þ>ÈÀ.Î×DÚT­JÌbPÞ;ù¼.^F£?„†¤$8L·mh?6/=52Ò¡™j«›7¾¯0 <Õ zÑR³±^wEJ7à¨?!nœgüÔ èš±®“K¥›Æâï vÕG\,hE}üK›*çÔ8“Ù‡¾4XÔƒ*w›HÝ^‰V©-vÈa5©¼U¤Ì׸æÝÑ÷Éœ´B¡Šâ°y³k =€êÂívCý4lÚ{[͇h<[¯'E’yuÛ ’[┓S“n×I­².wFÆbC<å\†{`RHì·Û©tCõƒ„2¥¶˜o€·Øøÿf6 -endstream -endobj -716 0 obj << -/Type /FontDescriptor -/FontName /IXMTHF+NimbusSanL-Regu -/Flags 4 -/FontBBox [-174 -285 1001 953] -/Ascent 712 -/CapHeight 712 -/Descent -213 -/ItalicAngle 0 -/StemV 85 -/XHeight 523 -/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/X/Y/five/four/one/three/two) -/FontFile 715 0 R ->> endobj -717 0 obj << -/Length1 1626 -/Length2 12707 -/Length3 0 -/Length 13550 -/Filter /FlateDecode ->> -stream -xÚ­vUT]í’-îî×àîîîn›»KpwwwwînÁ5ÁÝ ÎåÿOwŸçö}é{Öë+U³¾Z‹‚DIõ‹°©½ HÂÞÎå 3@ÁÒÖÄÕYÅÞVÁž[î‹<ÈÔð!gG  u»XÚÛ‰»€xš S€`a0sss#PDí<,Í-\Ôê*š4ttôÿ”üe0ñüO͇§³¥¹€òãÅ dcï` ²sùñ¿vT. €™¥  ª¨¤-­  –TPH‚ì@NÆ6%WK @βsÑÌì6ÿ8€öv¦–•æÌðKØ` pv-?Ü@@Ã_*z€ÈÉÖÒÙùã`é 0w2¶sùè‹=ÀÒhãjú€¹™ý߀œì?,l?tÁ”ì]œN–.€¬JbÿÀébaìòWngË5ÀÞìÃÒÔèúWIë>Â|h]Œ-íœ. —¿r™€¦–Î6Æž¹?‚98Yþ ÃÕÙÒÎüŸèN sc'S³óG˜ØuçŸuþ[õÆ6ž{Ûÿmõ_,]œA6f Ì,9.¹Í-íÿši;3{3Ó?䦮ÿ©s9ýÝ ê¿f†æ„±©½'Àd†À¨`ïò‘@ý¿c™áßGò¿â ÁÿzÿÿÈýWŽþÛ%þÿ½ÏÿZÂÕÆFÁØöcþ±cKÆØð±gr€¿«íÿåblkiãùÿrúWkMÐ?ЊØÛ˜þ«NÚÅø£%Âvæ´010ýChé,aé2U²tZÌŒm>úõ·\ÝÎädciúàõï–¾031ý‹NÍÂhm÷ìÿPìLÿþUƒgÔÓÐÔ’¦û–ë߆JCà¢æéðí?J‘·7ý¯Ã_aDDì=Þ_˜9¸_XÙ˜?îÞ n&Ÿÿ!åߘÿy–7vq²ôè~ÔÍÄüwõÿñüó¤ÿ/aÄí€ö¦ª‹±éǤý—à/5ÐÕÉéƒà¿/ÿGÕÿyþ{æA amÙÈl•ž•áR›72%¦;ÐÇ 9âPÖ¤V\è_kßë—¾Í]eôRÂÐüç­ÝséÔáu_†ö`¬džª7ô«€Ð‡Œ¦¿}ƒ²““î Ñ  9ãL3ÚûrQn J‡ƒIã`gJYÅ ô†è{'«Üå2·B,ò{_`ZcvZ3F}ÑéeÒñŸ{ª¡ñÑ‘áÞkèþýOt¹qð¼nPÈ”QþŽ¹ŸuÔ«¼cqÃXjP0 ÝI±O}[OÝ„°!v:Sê]kO À0ãhëdBCG*Å&šÍÝø1Nü½«ÓebŸQ¨Ìnï>bð‰vÙÇÌd2J[%86¿†Á™¬ÅÍaT+Чi}‹3>åµïKjDâ¾VøFÐñ‡é—Û@"…IùtŒyjJKŸ'‰fç’žæˆ`×Qá%i,éÆ ‡¨_ן§R›ÜDíÐ6ª’U××Ás&Mïgµ«xR£’E• ÆË»ÛPèr¶÷˜f9HyÖ@ÍÔ¶cþ…˜à!ÓU}ªÃ”Iß•ÔýTä¿Ndm뾧¤ÕÜÍ ±ô!!"ÇLsXèÊÞì¢éF<ÙŒ†µºq’‡¥Ür95õŽ£k0üp”®‰`á@/$›F]PøBÅû³Ô”)];yþaE$4Xûf§D#ÞÓpnÑ0ÚÕGFz¹l9@Ó½3;Ùføh>[Ì%@£ù„¹H$%ïœ+å#ísºzo쥸â“@’9cf§¡’È%I}K ¯-ÀÖŒYZ¢4”Aë7#j)×SnŒÿ=DÙÐ`}oZŠ7ÿ†Jô¨ Â!òjÒ¾£‘vì7Ôûù6×—$}1Âf/œd‘8 -ìãõ¼þÏRϽ§ ¶"¯’2=úH*S8Q×jLúª 9I’{oàW.#öÁ7ŽËÔ·ñ‹=Ø•\n0‹4Ôí*HNõ±ã íõíJk¥Ë@æ Ú;w¦'ߪ…Eùƒü¯eïcº5ØÀ–×Á{šhIêñÍ4ã÷Ü‹¹%Jº-ÈÁ{dø6_ó•ƒ}Nè…Ó&˜ý~Õ.Ô¸(HCÊùͯS(‰¾VUO8CQ§þÄM3Eê)ô’Î×Ú~"Ó:;Á%‰fˆI»Ý(2ÓtÈÅ„ ¨î¬¸…H…&\’PÛÏé$½[AYŒÌÚ  RÜ×±ï©=$’CL0 2}§SoÊŠVÙæ[r#¶øÅÌ_ÊvµAËþ‹¼£|iw£UnhèËÏ<'¹3ö™u©¯½Ì’ÝÈ$Ñî­âñ¶¼¹Ã~[…ö0¨cA¡"¡=}°AåugmÛЂ}«É€ë$<ΫC?JÛ”â>qúî\.¬±ëÁ!C²€¼ä,Æևçã¯LdžÒ-¼0à_K…Þ ËÐ(úï81ImtbÓ—*hÈ©Û9ƒ/¦¾%Ú—ÛIŠk°á ³"Œ‰q<Ÿa%Ÿ4TT˜=CÐr®µ€”¼¦ƒ3Òp¬¤¸À¤y[€È!ï±B¥Ñ;3\Vßøä|©xÊf¢@ D‘ÿû‰¦a‹y„ÚEK©ÚÏÃne¾ŒEÈ^Wj+±ä9¨z&xé¨vQØ×A[´,ƒHk©–íÜXX¬h <ÏG.y³Ã³¸ãOÍd€SG**_Í™<…8ÿZæ B­œ^)íFš4xøkJ¢_PÃPÉÅæÝHnÞ”¦ú^k4† -bÚ­# ½v,¤¿¾º–t (äŠÖhtXë&èø È“—QØ:ã+³X)VbˆB‡{¸sBh^©[\ýë,^ùBŸ²®áùw¶šŒã8Õçû¯ôl -63àÆšíïF²ª&)S!—Ê -z![xÞ@ÀTœ¨öã Y¨èúÜE˜Î©øÈU¦çyžWmàš œ3{q`§qÆ}»ˆÖ¾ gNU9ƒî‹á¾¥`íÑþËY8½9{õ¶–ƒ°U›Ö¢²½0»ÓL‰Ã»ˆfͲžgú¼‚©‚Ìå9 Ú[N!â©ŠGãwØœ)è«ne £” 7mô0á€xΤǤ$Œ_ß°^‘ðÑ1 -ÝÞ5jëqA¬±±ÂT Ïæ )53oï‡ÛB²ÝÎE;í+)ì¦Ù·t¯ùÍʉ`΄> ÖÚbb™ ^[RD|±¨Øœ}4ìíÆ%n'ÌêêÅ­ëñ" ÅúÉØéîh¨AØ»ÅÝãç]WMË»ë^‡>“bµm^Õ1|Ser¯œp§£ºÐ‡-¹¢Ew‘jG»DýϨ[fLÜZ©Õèë?Ž­Ô·½!ä£éÏ)t%¤?ÉK ñ ‹Âwf>’Ùd 6>‹m¦8KpAKÞSHýñæ芒–Ò$3Yˆcïߺ/Í’k´0·I.<`a¸Ÿ‚ó¸™toT‚—ž‹úfyŠXâ÷²ÙuK± î¿í¥ts€FS3“kâAyÜ™Ét¤rm)ºö QsÃÂÌüh*¥¼ žû}’ªNlIÒs'g—Mr<ÃõuQÐùËEš·Ö³}±½·®h”»îSÙ»þµ$J;û úºÝÆ7÷.‚ýÎYÑ­m­†›ÇÙ8®V8+jKµ/Žï{™þ‹8¶±*LÔŒ­ËEѾœpr8îĘýÞ3D°Ö±_/šõWì&²èZ‚Ì ¡µ…”Ã<Ž‡›çWP¹šÔa–DóðñùudG(|æ&Ľq^ó -lû\PE}î®›Œw« s')¼ Åäçê/×ÝBtßæÊjxý¡4>éå_¼*|vü„Ó‚>h~–G„í¾ìkå…›æY•Ž£á\µpZã¡`Ü ð/îÆÛ<?Èœ$Pï^׆½*ÐÎÓVvé·R6ŵ_aÁš Û&„1å©­®a¬hJÄ’¹ñö\òŸ:)‡]r]÷¿¹Ý^äþáÍÑÚY8ÞJü†ÕÂùÙ@¼Ž =4ÉHRî†éÖWŽÔžá¢·ÚO˜ß„ô!lNmN»2æ «ÿ^N)zŠ·ye{LëR2’*Ǫp>º´"< žYYðˆH˜nt -œ%ê€KÍæPöFûVuM*‰Ý}ˆåé†=Îv¦OHÓó¤¿ÈɸÍNÙ¶ETbd|Îȼu‘<œ*¬3ê„_üá³ |Â’船a`‚©jv(ïlNê²9Úì" fk¶ =Yµh³– ,Ô¶ \”n\\¤9{f§)À‡lo”n%íÅ™½~cÿ¶µëiü½/þ&¡¤ nwvÁˆjÅÖršÔˆCüÔk×> áð-[?ál Ò}ûs}­çi`Ä ç÷|Ñ£î·Äø€©EÿïIC¿¡C½'’0»ðoÚõk‚ÑÔôÃ/úõl².ö^2ìßóHZMÏ~Þ5wNH@U°·ø¶‡£–`ÔÁvY†}[:þ*’ø.o udYÁF¶¨aÊrŒ‡ã Ì?r*¶|´•g+$%¿Z’ícø&ß -ƒ<,xæxýM™ýÊ·NÎpføA—–Ÿ—KSx#Pë\Š¥J0¨¬ôÛJ˜É¾À“i¥Õ‰È¦zß8C7úÕ)˜-u€‚Èv\5éÕêÝðyðjDý™°0ªS<Þ-õA|âj#«ÉÛR@g -sBÐc@Îœž-§„svh¥ï·1;’¶T¯€S ¹ £Â5!ž7ªqvòW7ãçdÝצsÜûŒ”Û -¯äTµDÊwOW¤9·ÇÍ“ì"…úþØu®›ƒh<Ï9˜]¢Lu ð"¿­ ž1ØCζ5à‹ÌÊ×6Åfèf§/‡“Ý¡×è€>2ÿ„§,B§ÓÞ2Ö|“†9o‡}‘ë(^ šFD ³kºÍï*ý['¤¾dK}‘“Á0†Ê¸¢›–™êïG­íR+3Ì/ìÐàÅ~¯| ªé/•[þ_C²—kÝ´Mc>4D3  1ùÇ0´-pEèfîInbqéæ—ãÛìúdŒ¨DþWél¢Ùt\<lK²nœ)¤o"¦ƒÅŠ¿6ÐG¯²6LŸmiF¡ç„ÏsëyËÞæšÛíaÐÆÕ“¯¶óbáy‚ü´Aaž;w6ú‘Ø*1=Hµ_ÍàgYW§¤>×8Tn¢PºM ÙÊ”#0q+]ÆÆÀÖ8”ÒE‰n8ÂQ9Î+ùˆ†¸0Å‘Å+ÿ€û£üp>õ%Èúì=“Y«¸k¦’lÀ¹%¹ñÁ¥y½öˆtÆ@êöܯ—]ëJ‰Ý1ÇVѪ'È3gÔ7Š &„Ïœ¶a&4Qzã¯C‰|ð¼m³Ö/°¬ÀRÚ9­ŽÕË¿ÜöÕÀÖ(»Þ´oƒŒ²Iù<ÓµjÎHÔíÓ•_šp“lÁˆí¥ÿô¥](™½¾]Ör3òÈ1ïgæ’8ÌÁ>íxZ¬‘u7+-e៊—ÒÝŒâe*ÐkVI?sбz*H¶JNȶçúúfù°cÃWÊxÄ…ë±=’Æä=,gô:~‡ñÞúÞåßJÆNyÎ ÞÓÀè náV<œ¹¶±¼rÝÙñÏŽâˆbë°e•xZÀß«êoS½tm*æè>8¯¯‹*¨µPÀæ>NË%jç'BkS€Jó¯ NìSD€¤à÷}­þJ‡Â˜¾F~±T¥ò-ä·ÕÝg!®P ÒÙ¨šàÆ” aC¡†Aù¼1|räi®ïµçã"FzÒ2W³¡¼éL$„!TV|+ƒßÎ ¬I¨RT®Ó~ÜSh[Œ"ë÷#ZüÏW?¢NÝ<ü[aä¡kÙ†!è嶈›ù‘2O!UìE‘Ñê‡èYè\ÀKÇ´÷‘û+ƒƒkS¸Šh<Ð8f¥Z5|ûIs5÷ÑpÄ¥¦mÒ•«Á{N&\­3O<9¹ïñ–ð©ö¤´¹-½ã“íu9NþU5Á‰ü̈}ÿìX! -¤Sãr§µ_}É)p!O­¥Ã¬ìfb&R7— kGß,nøÕ¨Ó )ršù‡ç—ý6lI~Rn¦˜‚DÌm9ë†2Ji+\ИS°ß˜¥GBªUÂe ?ÃH½Ú†€ènCšóI!£ÿG`5¹nZÂsÂO/”|ÔR¨ûký~RéŽÇ{8)E=Å…ïš¿íËøSRÆ(o ³ZZç’Vžú˾¶£"8Á­.O2A‰tfýEï°ÛFåȉ µ? ¸óŠréÀ>_ºÑ-%MD×´-¡ù#À‰1tgM¯â{ûMjƒ÷ñZѸož3õ<(«·Ðê»S¨ä}¾Íoaí—ÓßXÐÑ:%Žt¿ÛÙÂœ_[9HŽ3Xp\ epYŸ‹Ö `(¡4Dz˜Ë›ìë¶2{‹D‹¯vÀ˜ËçTœ¸è!»uãÊ×Jä€æµ¤½ÔIš¦›Ý¼å=žM²]&Çé¹¼f36—í:­O‰‹©Jtqb0B<”âK ˆGâÍ¡gµ{¸¤n-ªld¥|ŽD}Á÷¼Öª³J‰þ™mÇ`Ý4&©Ò‚Ž=Ö±²®‚š¦\ìÝ5H~Ö¼œúåVê5ræäRÜB'Vv7:ÙXe…幨¼ï½Ï< ]Ó7C©WÀørÌþå€'Š«ÄQ±‚5Eø}Ì6bƘŽûÑ´Ñé¯xäšÈ[3Õ ¡¡­˜4«ã?…Å•…>®ÇÐm…5ñÛIŽ£…ü[==ú—¿d%ÃW€ðY‚@Ÿóm¶®ç4âo|ß!³£|²×O,$óÄë…T׳/,pÆúÆ8ò]{r\ˆð„`…ˆ Ü–˜ÜU&ð°|-.){œÅ9Þz)´;,Éš„S}ïˆ*Ûí­à§BphžR›Ž[ZP8([ÕWñlyQýC®0%&cq§iW~ú´÷>æ2m!âàŒ‡~a"–.ßvº ×?!v’[u.*³Ø –Ì kêY G¡ o„n+àýÂ4'ëw¥:ÔsÎ ¢º¡`UþyêñÆú;Uùñ#H‚ë÷B£½êe÷RüôF‹êa!T^*äþï|ÚäÖìÿ]ÞË ,ק²3^3¡Ó‰ÏÒ!S\-TÀ#qªya¶Î'!¨Ô9ÍÍ>“<‡_#Ÿ³ÖÅ|6<>*GˆB°4Djˆ)ƒ! @U,ëmÍLlÏ x«Š,ëo: Qqý+W$–  ©3Úž3Ûh¥Û›«x¨ò®f_ËãŽVi‡òjÒ®SqT*—!w7bþN¹@>â5ð‘±!X’‡±{ņ 9a ÍoÐH_`Ê©ÓÑ -÷¥‹ÍcŽ®7Ôcá kpÿCŽ°pš?öIã³±å3’ÅΔÔB´$iÈ4/˜Ž#ÿ ï È †#tæýšÏ§Z´E|]Ö…“0EP#ŒAŤu û9%`Ûš®¿ˆ7š³“s1Zݾ­©pãuºº Å\i€¿1&”XïñÉ8Awˆ'ÃËw¿÷Âü'”X].ßžŽ”ŒønÌœoØÛò²ÛŸ™Fv(…î`’¦ -ÿg’1¾Žê¯AÍL[cŠcâ•‹äc§©³Òädµ2j£¸IKá}6#ºq®Yõдõ*Ü lÜ´0q{~§Û¼­‚©Ä(žÜWr$Ò;3ËyÆã˜8·LJžeä”Ç\p‚¿óaŒÐDN˜2ŸªlWB[G.Rµâ®ØFC97£‡Ed`W§?뮳Øp'+±C*ÚãÚo¢7}1_CµN03H˜ŠKæ/[oݼ¢±‹Úµq;“n>WŒö™ÖÖ¹Oö¶BÿQ‘ýU†½2ö¡DÃdÃÑiЙAÛJ}€ËJ×t`“ØæŠ[Íq'Pw•@|£NÍpø̸ˆó3ö±ÓŽËp>îñÊÚ°¿ùÙÛÎ‹à‚±ÛúøQPùoI®¦(дù’á ’©O´ˆ´“­Pø)À¨n)¯Ù Æܽåó( çk­â zÀRÂm˜zB'Z˜=íȳò´`×L<_£S,=Ìݪ6}>‚1õ;ïç•Ýù.9’v¶ù«^¾^[ïåÇÆÉ5Qå\<Êà§X­I>‡ö¯É»®\e» YqÖ«cÝÀU±ÎyãÂ|àŽ ã©^EZHø†•O<Ö(,²üSöðËž9{á|VÝ,¦ð÷+©[è:N‰ÕYy¶,‘ì¾d˜–¯'–5êÇXÕ‹ â+šõíçø2 ýúºy¸ 4_n·LPOílÚý/º+%HÕ‹¹²ç=] -1bâl½mÓ å4‘œçð´{V@Q³1†ÿ>ô Ý‚ãûG¨y‰¾VÂÙVÚAm0FÖö}ƒÅÊE£Q0B :•<æÓeQÌÛ²ü®¶¸ OþJƒ€g(U;îQû:YõY÷÷EB$㢠)ƒÙMGp×_ø{—G<¾ÒZàjäYºÙGzüvN:yõ$Âc–ûÑy&«`:SŽ68H„|¶í‹ä˜,÷™ýMàú扉!¢¿«÷¢ X úèC©’.œÐ£JvÚébýòQ¦ã5IËô樚k}Êik’J OrÚ¯ 2.qñHÌñÄÅÉ:ÜHw÷¾‚8] r’’Š6Æ5•ô[Ræ“Œ(ø(}á›4.V'1ûv…Þ“lÂkÖà ¾_0jR¯—òyð ·ŒÄnüE¸Ý†çKØù@îCTI-t6 ¥àfaü¶­rªå @Çü8ýÒC«¼Xe]Ðþ¶Ì÷b9ÝʇÇ5áK=^B4꯭a—w¹¡Íe´øÙ±Q†Ò—¿ü˜Ï9‘bf•_FSè,ÖCÔý5.7Ã4»…–ˆ›qíŽv/ã(dá/°{'‰†U) ¨ˆ(Ø>·,Å{§Ën¶l„iðœ‚tÎϧž~Q¸9Gåƒ3-Âá‡_Æï°äú;̧fèõHr<屟=%ºY_yKt¼MŸsš„)Òá)j•ß¯”#ì› vI·"ͧý †•)w´Ãt‡ì?{)g¬uùžÉé‰^oÒQá¸D‰/eºÒ°„j½¦ 'F56l p˜JÜ×çž33 ÅéHì§;ÓðÁ«ã¶¬qIÌ5ª]'¬ãù´¤Q´`Ê'à'ïky¸~ü½pOtrß“ÔÁ±n ž˜GNàW½OëjùO ÏHvL@£f!ðß#<(ð1šrõMœF4Rñ«#4àë3R¸Ggä+6ôÄp9ÜïAÙkz ‚1w-SæM*œßà~b¤o…?‘Œí2á·Ò×»¶ÏbŽSZ“òA -¦g§usq1ÖÆ%Õ¹¯IGTZòªÃde{´Nÿºz:“¸jn Hì´jp²ÒË@€xŽ‰a}š½<Épëç ½ä¿x\æë"|c˼7û¦-pÞ•á˜Ô3¸¶ÅN<Ûúm[ ªÐ©,C"æ2;ù|öhCÞË ¢T„eNg§ƒ<ŽI>Ÿ%ZóΆÅàr§ÈG¾vŒFFt¡Úv;ªº”ˉ^ [NZðžW™BÍZpoÐñ)¡߈,»ÅU¬¡±øjÞ9J¢Z/s -Û~4ËÞÉZ‡º–A˜Ì1ù³íØô¹ÕÏ:v´žºÛ€½Â‡ û:ñèÐö¬5#{º Çêÿ¸q¤”£HœúÃ#vžc°°Ê”ø3ÄÊ$2 ¥¢.àÛŒëZn¶Üú ;tîRj•„~—#c?¸XKÇÆ W¾aF±Ÿ½d j¹8›HÓÞ=ÚÅ ðžýËë†ßíö÷ÃØ&¸/ØñÊR!i]^j“i$k0 ÙE×ÃDQ ¡ß¯•RÊœ -x¤ÈÅ9#´÷ŠSXÖúü Úê» HôÇ1ñIØg=f$)dà~B~Ã\èjòƒW¡¬–)åy&Qʵ¤HÏuýL6¢v“Û$|"%Q^²)Q»Õ‚2*ØOÛz2ŠÔ6,ÅhÙÔš˜‚²pg©òCÙ´„ë‹rir†àš9ØÐÔžp¼w§Ž¦NprÄõxÍä܈ U‹RDAh9 (@*.â+X¶rJì}®'óà Lmö䀊?Gí…r|yƒ¢Ká ×õŒìÜeMwäï’»ÓÙ¨þs‹4»©Ôâý&n9­ˆÑbû·n!КÏ„dD}„Ü‚/Leì§×ôSWѺ-1 „‘qÏâGíÒTá9·(Ðgl6›ÆºßïÐý[yzR¨bO‡vWk*Æ{²‚ìyqdºhì4ÜF‚œb£­S¦Ô±IÝùá}g­Í™Òž¬Ð’æYÓ—Pßl•é2ùw: sñb¡ÈK‹È¿¿HsþΧfZ¥ÂÂc8Ç,PlÔ>åÊ©¤jÀš9.}Ò]δßý}S‘Ð.U=Ö$“iH–Wÿ%ÊÄå©Eã‘(QØ[‰„3ˆ3X m™º.Úd1\îÝoÍÆ-±k_]ÑÁ L„~,~]'í!Gîì*„ùî‡ecz“wê±ÉWõ¤Â[ÄË*Ü{þ»3&D­h—!Nˆ1,¤.~þhëŒeë=¶-?—®uÅ!×Y8A›ùªvΤµ–›*¨t¾º5cNÎnp›ÝJ,œ(l_ÑGÏ€ë÷”5JЃcÕ´E)㧙¾O¾¤ÞñßÉHòÜœ?¾~oÇãÉ}Ê媋ª¡10d`v-¨i˜ŒX6?®MeU+üÞ‹mÊä@¡u1ôݾ5X-¡™I4á*QcÕÿ÷ö½û!Å’3ŽÃvý³þPlÅÜ>îzÀžÀÂH¿úöÚEKP!Ì]ÿšaþ³Rç*Œs5s›JTRDýOœ×Ïjd‘SÑŸZ.œƒ=‚] Z¢¢ã(%t¬øYúÈ-5÷ˆ µ‰NeØ‹RË×xNÑäÑï3î ¯«t!Éð4Er¹m²f!¨Ht*oQž&Àðøx¾ü9ß&!w³)ç76Ã[›ð‡É@]6Á‚ý$Næðc -ñ‡ÒÇu&æRŒ¿nöiŠ,yµ`õ—’Ó¾A8’e[£9júC«ô0$Úɶ‰…ºØitÃgïç…³KQƒ\êW &O¡L9 _q -­¼®M~´¼¸­T|©‘ìÊþH`¬ó^2Kð9܃l”;e+N¼#TÀÖþÇÐA¬ì:!]<§»-ÉÖ×ýÕÐp@øöh¹çòd÷çý»w0ìSTFCçÛ)ó:^Äm­HºÊeÕ®Ìñ«ôKvÖç¤ÊUp(Uc%·yIR á´Å!öE¡H°€OÓyS§îOÏÛÈIÏ#¡„ÏUßÃ,‹ì’bCbE“¤¢`ÙÞ|ŠÑcð²'EÜõ45àæuÎÓ¦ >©ì‹—·¦Ötñóà=ü -j¯ùslVâ@ÉGÔH»g‚çªç?¿³R†Ü"´&¦~¨Â¥9$P1€7C„îåŽÓù'êèü‡ºñ^š°^†ø·¾×Ÿ«lIý@¦ÇÜS¿Äœ€½år¾M;a®ñÛyV°Þ¹Ie¡þMuø–® d´N:²ýZ… ì8ìÃâ-Ó=iËP63)ÑðgdzªWÓkDOãÄØŸÆD³3äÍé¯Ã-4‚׿øe½¼Pòñ‹µ9µ_#âu¨BÌàˆìU¡\Q¯ñ¥Y"ùú¤ú.„dç… ]O5忺^ÝXúPU<¦3Ò²‚=hÔA³âSA§D‰XK‘NªYŽ¨ºlœ#K„Lß…çEžÂÕãsía¼IÙ[cš¡ð¦¸£løƒ ê©»Ï寳ÛÝ1;%¼ýí?sZʞͳU»J†ú†/é`µ£;Ðó°ûþz‡ð)ÞU*Db鸀*HF0ºârg[g¾Ç3é^<LŽzõ€cÏ#`<úŒRa‡R™«‚+6˜*•C©Ä¯:¿â+E½ÇØÔ{-Þ-Ã}7jwñçÈ×㈓³Ö´‰íiœ°¦¢áPë5ÇŸoŠ‹ô)å>û¼@3g]BŽŽì]ÛÄSpD€×¡B’Ÿz’ä=š€¥I”ïÓNNÆ ™ÑuüÒ¢\+²•¦Cü‚°5KóÔa|óæ[MS©÷Bx\Ó©Ãt~HÓZÙ ånNÞ|þTʾïà-VÞ¨Zßþ`mpÉX`‡jl¾ $ã #ÁÂbÀs:û.KEýN-pRKÀÁk÷SzLg*…?BµøZ@, !z݈Ú1±†=»»Aœ;ºé‘Àc“ÕC‚ÃN0Û—#>Ž?D2­éN2Ô½_ÐÔfÑ•¯n]HÅ^ò©º4>‡§Yú$-íªÝ­rN /ºîö¥†Ù8˜–Lñ‘¼9GèM,`h]••({@o=¿¢¢]y$5–Œ‹¸Y~¸›zº÷•ÿDé°ÔiM ÷´!ô];Ç÷öD.½Ÿè¡:Ý[„÷í ¿ú²Hç[A€ÔtfuU‡ÉŸŠ…åÒÛjJâuÌ3C¦¥ÜÎfÿ¢”¡ÔDsá´e%ê>2ÈðxŽj½6w¡7'¹%œqòöÝM§£xp§ÑWÓ½ª»ðýÂ<̧ܠBonw+ίu\˜[V4CäB¿K^QËÜ„®–½ÕSm#Ùj­+:íŽCŸ¥ý’()yU1'$ug- 7Snäæ¢ók÷SÍãMOÕ ¦m^ Ç}–•l7(êÐ7©’ÚíZjDv®‚g1üò'£üĬ µYÓÑî±Ã=ÇìÓÜlˆiÞ9§ÚèŠ9!á=Yº±“¾»šÈ ¤5¨ooѨ 3õ[L„DyÿgÂÎÕ¨«ÂnofÓ¯@¥ž{D}±A™§Än ¾\.¾u?ÖTF!ÙSèîÕÙï -ªøÆÉîɆÍî(t¡…R\ÙþgÃ0XRµ8÷¯ök¤å¡ÜuÁ¾ÑÍj4>_hÏqàx^Ù~ -‚Ó,æúf¾TT±ÞŒ¬.Ü׋O =œ’¿Û† -g;P™Õ7Ç¢_ŸÖt|:£_J•G$lÆ­åÂ’~™+¼—‘Ü·,Ð ÙëÀSßó‚Ä<ÇœÅþun-^ùU–áe\%цæ ]‰ "! ï6Úå€QØÓJìNòبÒyæì9óI˜Òð1éäãK½ tèbˆíQëðn¼N·O1º…ÜnË–‚þûÞ.t€ÅlÁ3´üÍBÉ$JÒ\íw*JB3 ï>®m–hÞ„†ø¯Ù{±V(}‡†ÊÓ]žŒ•Á]öGušìo ?¡µ˜–t†˜Å\´öœºµ B³ ¦1¾5×sf ›=&ð¯I°ÀHÜÿðõ¸[¯o¶XPI\¦À‰U,¸(_ñóíšó¤],|zn8îpù­&ã‚¥°-K&—HÄîÉyÍÐJk·ŒWU¸™ðüÙ{…í",êi£Þ~¯:˜¿@‹gÞÊ+Ñ­GÐAî~¢Ò¹ï¸#쌄ãÁÅòƯ(¡`tãòÈyȸ¿6J{lÙÖ³*¹Š’åwñó)Xpb5{Oº5¾G²˜®ÆÒÔ HX}=ƒ¬9ÿ0MÞ0›V¥ãTYm¼”9J“oD»ŒêK•ý5¾y ÂöÓj"ÎãçÙô“•*v ÔPG=2ÒÇ•K­v´X)¡Ì³Ù ý+Þz6ß3Þa%qãÕK& 7ÌéŒó2ê/ ðcÌÚá_ƒL_GN#³ V˜g7sÚºÅâ!ûS †“ì¡z–ökwfbìX‰ßî.Ý{öìçßnÄFá58ˆÔ_Ÿ%GÖœ7€…d¿QüâÍŸt¹åÊ)ç­Þ -|=”]?‚ó‚oêô8»<ç0]NzC)‰s˜|™V—#?øAS-Qñ'¡².²t± Ë島*§¯å·àQ”¼Æ¯ÈQËxï˜ÐðÏÞ÷rP5w»™Ýu«ûŠ®†!¤ß¸ T«²2 ÀS½~b4ô1fÔ•«2Âå\ˆ%¹¤“ÅJk7ó¦bbÄýv†4‰­îåB÷ÚÒÁF¡sÚ{û•‡×W 'Ðó¤C¡©ü¶ê(ß6Å=2÷36•–¢ëgâcô{^›óGÝ,ÆF­r¡àœ™ôl"¸ìð¹S ÙêÞ\PÕ‚§÷C¯¨Õda{/Å~WyÑi<ÉDŸjpÛ´fœ.Y¯N~ *‡£˜uîÖ 7RmIÆAAVñö«¹'Ss¢³TB䯨È­fž”-ß ç¤ÑâvŸ=ô æ0½)Žéa´[õ79ý†ñS61|¾H3$ÅÜxí‡O–oÁ‚¿@«g=O'ä\q(8õ/Å“æ«Æ\j.ö‡¤ƒ=Sa&}8Äo,‹¨³ÆúslpŠ–FaöƒE¦q°gŒ€U'÷GˆxÕŠR‰%®@¶tEŸ”Ã0”è“=ó¥(ú=øéû$¯–²6DµÌ^‹F´ZVkPNkqBä…Î0ë§×Óq°ídb -ù¶v«5~ ‚É«°5 ƒOs”í£4þ-a[É™?j ·³š,³Ò%EŠküþøH›ø€/BÊ¥çˆͶäßóØ8Ÿ–Bw2›rVð¼#§Õl¨ãË@ß2´®0Ýz>–B¤ÞBÞe#vð3œ^Ïì‰u¥ÙV‡"¿§§¦†V˜E¦&l2\óC»l˜Áš´9ùïGL¶„ƒ±~}÷ÌM¡Ïfà‚Õðn›0K8;‡pHz“?teNf»w(Ü[jE÷nùã¥8Øh -ÒwsZøð÷ßL«, ûò •oíšãtâ) A ˆ^j½æôãûõÒµF ¥K?ÞÍ0 ‡8í‡K/Î=œÈ„)}N[z©÷SdzbúÄÅ$Í<Fü²=.j ®,àwSѹ̞ո—°û‚&“PÀÁ_Þċ¡€5MÎK/ÝÏ·1q9ió±0¢ÎL: -=ÖÜñèæeÕà>A¬ù'š@©Ι# b_Qì[˜·, Qx؉HRB¨óÝ¥* ú|÷g*øü³o—XjŠv€[7ÓñqÂD— IÄ:<.Š_‡Žo û€¹wEK”;n7ÿS¾Lj±Yé¾Üó?ç dæ[þcM·³ÊðõÈhxV>j4~Ô ·žÞ¸Ä8¬âËh× Z;dªLÌbW€P[sÅÉh–L» -ÉKwðžóÜž‘ËÏ›Y™•!b Ó+~Œ-vM ;*ôBF¶,eI †IÁ†¦)œ*iè̃k oÍ)˜rD˜+lHI^Û¹85¾‰W°<á=—kû.Îhf<¢Kƒ“X| çp2ª¥náÒºÀÁÑE¸ü”ê‘–ÁÒR^à³ôúô0d½YBÊߠ儵œ‘ŠJÌV'\m|`–o‘Àõ×A{) e „ÂæúA~V'zz³’)¾w¤([ŒiV7™ä²b[@æ¥(¤Ó£rlü™ù&IXöVAl¢L!†&¬ò<Éý•'rH¸ÊØÌ4iRt]bÉ‘Ä2çþ}jt¬!ùèlŒV°/Üb8urÉØlÅ6e„ÑSŸd`B³œê‹l%Ã'(¡TOÚ -ýXÅþ~”k>mÿ¶Åä¬ -endstream -endobj -718 0 obj << -/Type /FontDescriptor -/FontName /ZDVWXI+NimbusRomNo9L-Medi -/Flags 4 -/FontBBox [-168 -341 1000 960] -/Ascent 690 -/CapHeight 690 -/Descent -209 -/ItalicAngle 0 -/StemV 140 -/XHeight 461 -/CharSet (/C/D/E/F/H/I/L/N/O/R/S/T/V/a/b/c/colon/d/e/eight/f/five/four/g/h/i/l/m/n/nine/o/one/p/period/q/r/s/seven/six/t/three/two/u/underscore/v/w/x/y/zero) -/FontFile 717 0 R ->> endobj -719 0 obj << -/Length1 1630 -/Length2 18441 -/Length3 0 -/Length 19294 -/Filter /FlateDecode ->> -stream -xÚ¬·ctf]·&œTl[wXAÅfŶmëŽ+¶m;©Ø¶m'Û¶óÕó¾}úô8_÷Ÿîóc±×Ä5qÍ5ÇÞäÄòJ´Æ@CQ ­-#@ÖÂÆÐÙQh# 䔦U41sü•³Â’“ 9˜8Ym… œL¸j&Æa#€‘““– ´ss°03wPª(ªQÑÐüøOÉ?&C·ÿÐüõt´0³Pü}q1±ÚÙ˜Ø:ý…ø¿vT218™›L-¬MBrò²bJ1Y€˜‰­‰ƒ5@ÞÙÐÚ madbëhB0:¬ÿ}m-þ)Í‘î/–€#Ààhgbdñ×ÍÄÕÈÄîÕ€‰ƒ…£ãßw€…#ÀÌÁÀÖéoœ€ [#kgãø+7þ+!;à_ ›¿º¿`ò@G'G# ;'Àߨò¢ÿÎÓÉÜÀéŸØŽÕ é_Kc ‘ó?%ýK÷æ¯ÖÉÀÂÖàdâêôO,C€±…£µÛßØÁì,þ•†³£…­Ùfðà`bfà`lmâèøæ/ö?ÝùÏ:ÿKõvvÖnÿòþËêæ`áähbmJËÈô7¦‘ÓßØf¶°ôÿÌŠ„­)ÀÈðo¹±³Ýè\LþÕ Êf†êoÆ@[k7€±‰),½,ÐéoHåÿËtÿ}$ÿ7PüßBð ½ÿoäþWŽþ—KüÿzŸÿ+´¨³µµ¬Íßø÷Žü]2¶€¿{ øgÑX8üÿ| l,¬ÝþO^ÿÕZÍäßéþÀ$œ þ¶EÀÖì/5 t ÿZ8ŠZ¸šË[8™L ¬ÿöì_r[ck [“¿Üþ«­ZF†ÿ¢S6·0²²ý‡Ö«LlÿkéúWþôò‚Jr4ÿ›û/Cù¿ƒà¤ìf÷7·ÿQ Ðøþº¡wŽã–)¤Óµæ -¦MiWØ-ýi§…I2°±ƒ)>•¡õ`)óŽ%Ï1ÅÉ}×ÙsåD¼NKj¨º†Û­¼UgU!B 0Q…€¹GÈÐûEIî“$AOΦ$""®*©^š?œå<ºâ§IS9Y°÷É\¬ù3¡Ã½ÜeÃRץ̋j×|³O`,ŠIÝ›ó(Ǭ. *´ƒ£®<"óíf‘!°éž÷ŽMœp 6‘ÑcägÏÎÂèL³÷±wbñK2íÅ÷•ã˜§+›V¼¸£ˆ×£NóhäúõôaÏÍc±2™‘sW2B ^Šsw} …ü*%òe¶“lÐÎñM µœøËs)3µËuãbe•vS{jDé£ÖŒ»£%`Ì{$ÚËrÞ—{–ÞS…§™Û ~H$s>8¯x^h #x­ Œ™–Jf!ÃÂcÇÌždÒn9¢—Â0:‰â>}”–í¦¹Ì¾œáïñ¿W¢_b²Ú’á“•¤93•ƒu˃‘ò·—†¤Tø*0œuÝìœdÄâ¿ÞÖß„L:;¨LÚé²WÿlŸ]7Ö4ÿø§”8ƒÔN‹›|ÛPf$y Z ¬“lwÐúï|de'Ñ…ûê)‡U2)MÇíø‰'˜‹Aã4s)Çï¶Ó´$~•VžÖA€6ôÊù>òµ8TiØi’“o™–ìa †û"·‹)w†TZlºàúq£Qs!è$'¼Ô Fy6¼0Ð#+ß½–tÐé°eæB¨ªºEQã*Ø–¬ë`]ô|v©ÑA¯’ÒÓAr ²QÆ«{¢zÃ2j3sn0§4Ðÿœœ@CWö䥋¢4`åü¸ƒAànã‡oÚ Y·1s«¨Í85÷Ì‘#¬{½°™ -Ô§*ìé(U‹›ƒgbLhF¥3ù~ØG,{‡åc׃È3FÈv€Bàt¾#}f»l3= Єª!¯ *ÉÚG4®ìš7µO‡. -ºïÍ#|E“©;…ƒÆF=÷øUV´ñ¤±NAþýŽ¦½Ú‹&1êÂZØ?¦»;5ðçn…°â%aZf,®O«µ³KØï­ËRøq$“°¤oYЩðxŸ®/3žn,Úe÷kŒ2}—²Ì€K`t˜¦ÝÃ.ÚÇK±ƒ¤Þ­§eäÌ>¶Ö–0eáÞBA_Nv¹Oè(0VÒ W¬+ü×ôÇN XÑÉWˆ)VºÉO>tÇq¨å‹›và…¼¸÷]fÉxÚŸ÷™IžÅÀ¬Ïþ¬ -“Éš^Gá÷CþrŠŸ‚Ë/3}NeC‹©ø+¿óÂ`°Ç‡ÉÒõΓšyÇWû„´:‘x‡ìg\æºD™ÀYV8ʃìÿªš~M¶“§fç:çÒzð(>”V¢«ÍAó̺~µL ù#áx|Òw‘–ñ¼¬hè1$>íl¸¸”ÙN†§w Xµìú+Áp6øÚb°íñf!´¬7Çò£Í‹>ÞmßhuT‰Sò”s>3âH€M–Q×PZyÄ]¸|ô¶èÑÆefoL‹j ÷ÍíºÚ䉂7qÍ+¶ñú bÉ-ο™#¤êQ¢ùÀ¡ûˆíîÂs'¦Ð/çÊ…Å“QŸa¼œ^ç<ˆÿ)Lüýä!È5‡Ÿ µXÄJ±Ò’•Ü4`´S}}w÷cÊÖòßçø“zseäjô|‡Ó¹ù§€We# :±=\Q«àH…€š1‚âq!õûð<ëyZ'jzQÚŒ°ÿI\l$¨„¤-o'½.™(»`M(™{.c-P~5/x&ÛÏ ü6/í$dfg9~å·JÇ Ø“~ýz-êÕo÷¡£dé¥úÁ;òßÊëÑsv«ë­KÓ„‰Mü૯5Uш໥° û¡OÝ£ ‘ Íâõò,|+çz’ò€Øä{›Ì…Üë5Òz!}|8ùí‡n®c=èÈèâ_8˜0)é¯8LÙ~‚ÖÐUøœÇ™¨Pz“FÚÁfUbÑ‚(‡¬Mz_ØäV•ÑŸm¤rl®+¶íƒä§W&)D™ ,߇Ã&Î5ñ &’}ÀZ!EæzòžÍ54}Ê&´ÜOµÑ™¢á§ÅBìúÇßb£Ÿz} #égpZÖØE²7ú×x»¾Éˆw˜Å Ú˜8Sÿ>O’i°ø§ >íIÕ¥PÚ€TXX.U7Õ¿ZfAZ|6ö⛌…¼Ìܨ{†úõ™eLf|Ï8)­YhÔf?…,¥¨îô2ß(z¾¦Êlª.JŠ`Ý9IàUÂ^Ÿ[Ÿâÿh¯z­÷ô)ì «˜UÅ)šÛŸ·þ‹ Ü‘0õª[ãmÕÞ–a€}Ç”¶9°¸#ÿ53Ç•c–äXC·©HZEã(ãKSoâ¢CC•‚´øƒlöòÇ—õ9©ŠêÇ£0Çycî{²¯…;x]ý]Ÿ×ªUà]d–IØÄÙÀ'.5\éc˜†‡Kð« ¼hVTJ_,zNÛìorñÝ,™›œÖu¸iã&¸ ŸXŒ\ýž¤o;þ§5G33¸„ŒH^Ôtæw7ê>b–KGAˆãíéºxɯ‰R[‘!5à~è²è”ò kø1ÙÐ:Yç,¢ÍóÑNÀl†/ÆîÑq‡&Ò,5ù^¼äDZ“ý(èÆ+ŠÞaF/Ë(©'Ê_R­·ßŸ$Dþ¯Çµ8èÓ³¬ªªÙ¡= -Eõå¡ó9º¶äq‹¬?“ôG¸˜ÁS¸ív -'qB9^û#µ˜ ½Wî¹$ëÝ›¶©ß"Ú¾ 3?ýfR» Äã­¿î{à q¼l^­kâ„ÿ(b[$ÊwÁšºšëMÑؾ-’sö cåâÀ\£–‡Õ–†É!VŠØu‚yDåúÜYŠ»µR/=ñ,Ôõ'4—[¾wbÜÄ€Ú ö¡¯ðA®à,ú ¦³Ö!q–‚Bz”tŸ¤›[s)ij5!ÐqÈ -Y&}j$J³•ý™°V#‹Ê~¿Øª†ÄM’~¢Ê¢>.KÓXdOôú#eAp[a€'bd*c¦5…™ÙÉ0Z¨²#'B` dpeùw¹¶Åò| -ä2´]ü\fWJh·Ø`HUukô¢9ÙÂG̸t_Üà÷Î$k†tX4à Ì)¶ ÆLŽ¶`ØÖŽ‚¨H”ò°ç6ÚL4Yt§ŠŸ -cŠëääa„êD¾VÄCN†,ÔV„Œè‘ªŒ KXO ÙQýZlå¾pËŬ/!ÍqÙ™¯—ÞE·ËÙzºîƒCù¨yP¤Ñ&›Vnÿ˜XQòT€»lÊâç¥ðÒÜèª-ŒÀH¹âc³œÝE˜¬7"óÿq3r­fÇ -ú3Ƹõ j_I­°Ÿm¬šu ñÎ'µ0× MõöºdëöbW{í@k¢×ØxMê«x+DîôÛ8˜‰y9“Ñ*LœùßIWa×ãæÛBüŸuc,™–Ë»œÞ'bÞjhh/éR'þâÌJŸ Gg–ŠÌˆ¤¿¬Ñ8dxKí£‹0Y߆DiE l«2_¾H®ŠÍõ(¼ öKŒ+Òïæ˜@ç€_y?>ãÅØ?I7DÚ'åwønË"¨Ú²ÊÅ[]ùr>¯–~TèW‘Ò¿r}š1»‚øH`\µ'Ò‚Ó)Òë¹-Nð#5jõ,sÛÖsn¾Œˆ‚Ñ‹aꌓüTøºvõûŠ*‰H¾D-kpdk+DÆÄ$ÀtgnŽnøëöËãÄix¶aÕFÌòfIWQÓg#‡¿Ÿ“[Ão' ªs3%…ùÆ®G`OÅôq—½ª;ÕÖç®zGù4HäÇšìKW¥R~Ç£Y<ÎŽM,u;›Ò¼jœîU>Tà;v¦•ð½À fKþ¼rØS@=jÛ”ƒû³±{D‡9?Ús”ˆôšrÛVeWˆ§6;|LrƵZ&þí%m™óq|[ ^óö4m‡{ŽÇœ[ݯ«pª×lÇÓÌ9«¹ ª«ÌóÅ~Ž¦„²i!kdå9,²O‚[Pˆ€zœØ]â`Ò†ÿl@j7[›øeH øm7hÎ ÇXÝ<ÿ»Oñ¦øjÚ–=º~±u›7× YQ"Õ)/¡ÏÄõ3¨èÃ÷±@õG8þ™±;þ.pŸ‰n²~mÇÓCE„ hæ3‚ƒ¸›Fí"ßâ›ÁÁ猜_X|zA ë™›Âë ¸Û†ŒSÛ¡ÑP…õ­FýÛoÄ6*+ko8EÉ;À<Ï®Ÿ)Î0,HÏ,§Äp×ó{2*.3œ¼ÕánH_Ìø¥û£›}ašY’x4œÙ®M6òtýÙ *¦AI^¢•çXRI9ä²k©ï–ýX±¿Î:¤Û*«%˜$Z;Ê;h}Æj‰ô‡jj±ÊÀ²IïE(eðÙYÎ3˜G&"…¬Ls©˜±ÊÚ _pxÚÔÒA¸Uš14`ª¾÷Ÿ ÷ö×ZÄÃ6'Ý”ê+# }B¾âv•\ÎAŸ¬+>2ñ\J%÷`No)KU‚œ—Õ½„#TEúŹÝ÷2Òq¨’{é¥;C'U³ÄM˜/ÛS ¡#ÒÒî9îÝFÐÉtä[’»+s3W¾µŸSífÞ²¸#‹Ûœ¹Õ:,¨Ï\PØLíî0[¿úÌ zÙ¢Îu.‰H{.¦v ¾þQý£¿ÿ­G`Nv|VÄ-9Ωä”bšxdaošé ’ôO½nå¡êVŸ ®¿žÍ‚CyŠŸõ­Ðp«´ ;8.9ºãóâ‘M„Þ·¯…Ý=Ê0ßQ`õâ€óªá4x®·B×PLÍÇx;8(ö~3¹ˆeò’õ|å-õóV´ã/4OÆ œHðÄ噀EÄ„`ÔZŒâ:ëf$‡±‡ùñtâ+_hsð‹Q»‹hæS‚kÂÎG±ëc¤AzÑDïJjWV9SG—­?êp Y¯Êüb×oìRʃ+V¢T å3˜—"u0¿¢Æô˜"ÁûC]Ù|jöœ÷^í†~ÁøÃklÅ—EbRöñ¡ÏgãB3s$5$jj™Tä:Jƒ,"Yšß{L9Bbiâ.ìÏ–Ô¤:²Ü7Ï[1Ӭ΅hp~'žÔ}ù»Rgš½LÔ+hY±z¿Å®åàK…ÄJ5¾UòMc¬Á,š™ðXz5çîEöJÚy„¨ NC*Þøîmú¾”^B‰í˜~Œ¯.*n°ç©©!õk(Ëê,$AèãéѼ×g¾½ -¿¦‡Áýcµ|ïhp¥UÆ=.èµø?èì30ü*n=à_­ßGàk}™{…W©Ú…”äç„¢ÑC6[i e¿aó1g¼jÁRÕݤ‰TÈåjù­Å o¾ž?ÿhò–’ƒtF‘ qŸûד¸S× Eº Ù+]—[)¿\玽tuÉ%Ìd9À Dª±Y¼/»Ê¶V*˜Lø9Ü“ÂüYÃLÈÜæ[œ$©­×Ã&Ì.¾ñÆýY‘ûƒ‡æ¬ÄzÅY®tòÓÑ.Ëu¹Bž ˆ ²äËv¾0Ê® ö]¡ÝD¢ê9'rYµVN¿û£ËùtÔ$,duGÖ-ŽýÜ…^"!3ð›Z‡6ºk’!ŠuF¯e¡%§s¾Å>£Ž`«R”óèŒy[®[wRà8bÆ‹"íLÛ²Ѥ¸¼ˆ“z9ª]\Si½-Ëó\uy€¨n¥N FE¨ƒÚ¼÷¹˜rñêj[v‹H/(ISæv½.% O—ßãIÆŸDsš˜GŸï&UÁ)j®LåáåÕ -–ŽÏc¥g¼žÇ?Uͼ¹õEö¿ë)`]|[4ZKæ#•Yµð¬#™ŸM }û¾¹w¯aê­3 .N‰k×|kGiÅéü’`œÇ€W"AXÀUf¡)­%sß„à’?{Éžø ìËâVqM&³—ù@ÐÄgô… -1'ñà +Ô{–iŽ8ÃÔZ3Ð#›ªù½Šž -w®Zƒgóz ~”Ž+1T&(|duà§ç“¬Ð"¬Pk?ˆ×­2KX{ƒ¶Y³Ô^1ò+²°’7ùx£¯u›bÏÒŠqïx9ò;¤Ùå!ÅA܉˜~rœzµ$Tb”õu콊ô+¼„Aê­.Î5¸/$^ë·Np³(T}¤Ó»–im›E,û$ARE÷E4µý5°†Æ–g%ÖÔ Y{^HÌËKÎs÷`¤C·ÛZûœ6ûø·ÍHHÊD‰¯ît‰¾HZ#MÚ¡`äÎ\Äi¶~$—ʳT’te·L²”ëü¬è„¡7E =ÀVgC–½ðÈ9Úö¸¤÷st£®Y#¡`õ3(o‹4D,ƒŠÅØü|‡¡1‚)ÐâtEYjÏú*M>ºƒVö{C2‰N*>¥OiG·E'ФÊÔ£Ã[E×Ð!‘Ô­:‘|,¨c¬c‡ƒkc“QI2mu)¦ y½ó\Ñ¿ÝþúŽ0Ü+C€×î¤#cÎ0÷Ó’Ð|YRùÃÍÁF ßþMF}9ö'Åf™""%lsêYÕ±¼f&q@FÍZݽÝnH}ËïÉO©Ôõ"‚'1L†e›{¾úg%-.9CΑÐmð[Mù Ú>}ZQ 2ßi¡“¦Ò9Ì@0‹üÑ4~Û‘ò¶DpC^,Rb¨¦¾M‰ï2rÈL±àº}%B^×Ô»l{«BX¨ìD„´µAO(Âèö)’†ék¨Þ?µ üÖ6ÃMó0Ëßy(C­«†Ú@Ï¢h:ˆwÊ&àóQ`Ñ 4;^îùÇ„±ŸOàXñ@•n’aÇÒ,w4¢ºdxÌÎ_mîçH“íÛ&…P–2¢î݌ũMÇ`¹¥™å%^ZJ4c˜ƒÈ¤:ÖóŒÐ®Qw9F,\´ì“ ™;¯Æ¥Š*½”ò>Æþĵf+tÈ•î•›Æ료¾ø;Èi¹õйçrãéÌ>S^TÀ¥ª Ûˆê„—Ö1t ·¾»¯È KL/ž`­TÕsŸn¡a4SÆ°b°†F¾*‚ -š”Z–•4ï<×âû–Pý˜zcVoþa6ÂoRäI6ÑÌ´Üo8—rÊ“$,KñˆX>Ã//çÛ¿Æ.FS„a•·È—“G!v¡雪™KÕ­Ï¿«|ø„˜Q"§o±"úlÂÝïsÖ€Y‰¢ßi›OŽs_•4R,ƒþö(ò×ç(ŸÅ ‘JB7{{§œvÌ&_Ž.ߣ*( 3 çUzÜ`"â{zs­L´(:­:ôЪHr]Ù¥ÙÍã7 IœßGŒ¨*ì·FÑ|ù,‚®!¶É_¤¼¥#zÕDÁE<¿š8iÈçU+PÛ'ÕzÝl½¤oë1(ƒý~^ˆYÎú]¤âg¬ý3ÄnÊžc2i'³Œj -“"¦‡ÅzWN\‡?zkšG±Ê®rÈ_p«00v/•¼ŽÚQc`56BÅSíÚO7ÞtCõ¦®@‡9ß#¯û¼íÃ(gÈÅ {^SèÜ"„˜<•ü´7•Aùn³ÜúîJ"‚¤úÚ‰@HÎòzs#ÔØ˹d/i(³Ü/eªmUÔ±úÌTVûDò˧¤ è#òàYÈ6">Ó‡ÆõÕÕÅ󳋙’ŸŒ„Ì8”žÎZbA¾7Ao›Ôajµ~‘iÅjå¤Xóéß­tß©Vq­A¾ÜˆÔNÕ)*Ùv#öXƒ*IÞ”- ÑŽ ”Ì#z¹·]]veO$ `äijƱ‡½¢ý)ø½ïøðÂÅñ¼óçu˜Ug5’¢ÃÔ[—…É|6Tœ£qå‡=.ó†‘G'Jñ¹xWË2D…Ä¿ì2¶~ òkØ‘03=âÝÞ¿ÎÉ83ÇAVß³E½ìôVåTHÞG£j tFȺ}š” -aòþÈå H„XÖý¼/µQâïXûhÁ^Ë=­y,wj®ûCÖ91Ÿ‡!‰Öv@ ÒKÀÜdµõ`º˜©FlºeXM†Û(?uê’G%×›`à<²Mqž/Ìú|pvʶ&“C:@JÔCE»·‡÷H5˜r\$Ç™¹Vf—ÿÎô gy›|­ ¦ˆ²ÔȶÒê%gÌÕ@È'›‹ö‰mVG0¼€µ¸ÄÌ2àÕ–ª¬òÃH]Z*—ÊMâÿ±jàv~IÞôkçÂ(ÚìJ6Ýág¦NÜÙ¢ýÚæsPc6h@Î6HÊ-)•Ñ“ÐibŸÄ\$æص˜Õ®í,_!û—ªdwtô~ÏÎï<¨ò°µ8:ôä¿"Óreýk»¢8ì÷ÀÊÓ}É(fhÚNXÓ Ÿž¾˜õçl6k7U›žñ¯ì!犬,±‚Õ-™ÞèHt1(ܪ—ôeúÑ)¨¢t|v»R+ó"áýòÑËÜ 0Qwm¶rÐÕ˲˜î¼Ü+@¹?Ü-­¯¥Ï0˜þuö:-¥Ô{ ¬êÊ1²Ü±&YÁf® f™#{+™Æó ƒ86•šxLR¦"w S¤äü‡Þ‰#¦ìˆo‰í‚©˜”Óµ¾ jû“‚©9öû8ø¶ÐN¿Tƒç¨õËÜU’‹ ƒ(¥S£`'åã–[dDW»ýÌÓÈ*¨¡Îfî<ˆBë·-ãѾ”°rD º*¿/’|thQPßÇZ9™<%°7 ÄÔ·ù¹ .ö˜x_sìæP¥¹‰*|~ª±û´rˆwcÕõs£â(}² Ía¬­ÆŽ½&K-±:*‡~c5AL¡.lÖY"C[ûêÌ3‡±V7\R‚©uÝB« … -gǦÎ(*ZÈš×î¯Ì|$ËݹùÉåÀ¾vLÊ°Õ2Ú«]Oš–È÷sI®±Évù¤××}ñPë‘Ù¡›.ò$*ç>.Eéz9s(¦ö÷¦÷³„ óC»s¼é»n7>~ØÕ78wÓ%ÊÎsÐ;s°÷áp¬/Üß(î»ì:þv·¯ ­?õ%9‘½Ó›®ú¢ÛŽˆRomîë´ ï -=ØÃYÐ\Ë ÓËBQH òþ”é[|œÂŸ’µÃ¸L5oÔ7ø›È­ñ£C.×|&[§2#þÚˆQ>ÃÀ%q·´¿[ðmà_¨”Â:›{z4ˆd×!ìÏ‚ 6ö[&ý•Á³²BMÈëM„“µKM¯q½FZ©¯ÙgX#SÀzU8¦‡7ò-׊KY 2ïu¾‘‰p'j.·vlþ—UE´ˆD„Kå³ÁøÞP®å£oN•†º|ÙOJ4µ¡næÞÿ÷76¥Aq#¨Œ©îT¡ß%÷ü³½MMNFµ!Ý£t§@Ì>½ÂuÇÏÍá…jÑåðÚÆËàgÞèa˜d|øÚµþ½âøVà‰k ¾”üï|1›}ÿúR’ßk+³úvÌלJœ|.íR¹4o«Gœ§íwQ[Åîu<>˜°™Ó >Ö¢¹²ä] ßWhãdYðe*hŒ9™Ñü]ï…1O *»ÂÎHRrɉ³à(Ô<<Í%Éú 5kå´Ÿx¾JŽ¿EM00ísX „[µñH>ŠÞù`™TwSçho&^âÚðrgOÆc39iEO<öëøh!jƒ“̨¡ƒž\&åÓ‰þ@|ùjÊ€Èß¾V¥ÈÏl"CüXêQJ?(ÅÒx{³o¿ô¤à -”nÏò~ö8Rƒò-+ÖÅš~ï5t=["It´lÄÜ ò Ë=g™ ŠW‚’†ÝÚ w}é—ÕOêiZê~È`/n›åü úMßAmŸ„XE¸€9ÀbZ‰|*‰ Q ³–žØ½„k›ÊHɪéè<ˆŽÈ¡0§S†DÙgsí…•­bË3T¥zw|ëU–éLë Ò¶üL¥>…0:M|aà‡ò›qÝÎd;â[Ógˆ¸ž®2?Dµ½§óÒÅödµ_Q SÅn#§ÇNØøâ¡]Át 4a_=¢8h=µØ$_p!‚êÐSñ_èçb}³([ÌØLÝzÒÄHãq'óUŒE’pRþ¥ "`×´6qJ†e«2óKní'"ɲÒÇ«î”» -K 8ŠÍ-9€UÙå£+8k`3|ËfŒàd”¹›¹dËŽžE~î„uMQ0=h2„Q¯¥”d(g¸ÙN1²Ã†ÝZTˆJÏ%SJQ1BÎÊŒ¼]‹O'Ü×¢c€z‹÷Á—©¥âµý*o8n8iÙù:|£6[BÚáBŒàZöO—¥’DcdZÔ’› *סþô5ØqR^}Ò’ !NeÞú¶sƒ¤Kr·Ëwïøo­r|GŽê9GZJ³Éo.xØ…:ŒsZMÛÈDUÃRf›}î)¡±K™£Q3¨]ùpm§…Iñ¢PÙ½¿wÄ„³þ0ôj5eô§¾áèÛÊbÞ4µûá>Ý ñ}ÓâV‡®“ ‚ÝG©¯˜ Wúhpe*åð[›öE«õæc‹óÐpw‹‘”Â…ç Ië®_ÓuÖ›+½zo¿ÿÕä‹DwªF2à‰£òZd»šGt7Kø%oÐjãYV!nMXâs1@8œR)¸vö ¿‹±.Ü­°ŠémdHŸÏrDÈ-Äö×™_sÐ’„‡›ãã˜Öý ?‹ò|á$\ç5þmÕ–)Ó4>IƒŽñ|‚ÙBiÛZ¹K·æ‰å¹¬è\"‹¡Yÿ[Ǩ(Lµr?–„í. ÄãvèÒÜw kpÒƒ¥u‹ùGj—ï«ìwú“F‚’C^:§£;?|5¥»v9Ô@Láþ2³Þ0'K -ô„¢§´u¸¹ -°ò„7¯¦-«@a¾"œk%Bññls XT®6祱 3ˆ~0IDËozêféAD’“p¼ÊoåÒÞï,f+=)is«}Þ5Þvš€¡p?Ò]Ôá[²8dËV ›Í„Yº<ñðitBŽØ)CØýêU šý—ZÍSmÇ©–y\—î¹ÝÁ¤-3¶_g6F·xB¯§é¤»Äà]µFþ( MùèN ‰&Ä,ʦõv˜Nþ²å•óšÁÝ¡;ϽœŸsùE/‚ûÈ¡YUŸé×Çy;Ý%S˜HÖs›[^ìúôg$ç+ Î휮_ƒÔ´,WUº5[Ïá#l¸¡©o+äßd¥_ªôì’åPpÁ¢Á#(b0+X5 ¤±4îÜQ5ùs]ðÿˆVÂÒ‚¢7ÿÎ,­?†x`œ}LQ—ë -ƒM¨=,:Á0¯…ý}Ä“WÐ8¶ŠœŒ‹A÷þëC}Û úٷ٥P‘Š¯Â¾º”ê¹Ýk¸â[Ó»Päe ÅÙ=ƒá"Žp·¤"<7e#¿†§§ÈCX¸µz%Èoh44~ HÐqw—ÙåJis¹È\Õ:Dïwg©Ì¶—Ù7›Ëˆ;­gL_I¯,%Ȇß@+´Ê¿Ÿôˆ4Ù€qµZæ²Ñ?™QqéO+†ÀíGÄ@ÔkÚ!Ÿãs+t)tZÜßhÒKÔˆ«äWKü¤ã~hj™ccJZ+«Ç~ƒÕ0_,2†ÁÕ<’àáÞî…BdæÓirˆ1öa|ˆQ÷˜UáåÓWç_®/7uçàƒ–%.}íf%Åö7OiÔ7‘’"öð¦áÊÜP ñöÔ µ„ Çú³­žä,èl|@:_£g¾oEKÕ¢Îå 2G#`½õÑ^øÕV^ž•,ç ±§€e-ªŠN•Ëìg÷ "pŽ@ÒÍîâUŒ(Ù¹Yð^ -¦4¢¼eÜ:Úñ_4pDŠã^Q»å2 ¯[Øŵ¯Ž)\8x 6›Zä*¹"JMüjl#?^ w>=æŽr Wöì9ÁV¤+C¯Û}f^wô˧ª2ºb³wæ«ô>º¨[ôµû Õ…’¶´(ä\IàûºÍ°<Öé%v-5™‰SäÝL­”D–PÝ»y,*8™NÞ›Ç2²·w„Ræ7<Ò‡A¾%µ2³<˜ ýV,½â$Ârßc=U!Up»¹F9ÿÈ%VíñnC~zRÏ;ÄMƒ&‰a lwœŠ42;‰ \®p–ž)ÃO)PÑ co(¿ê°n¨÷)D¥ïèR|ÅŒE}¾a¡\Lj×,ø…[fÍ{™Þaú¬t>Æ)£ta2ì‚j¾Ëž›`9k9Øj*«ò,ݶ1Ö+Å¿|B×êáX 57¬úºÁA0¦Ûyøl.µI6Ïf.m½[ŒÙ -é¨}§™[ýУ1êHåz›ºÅÖVAw”›~V˜íÒØ‹ð¹¢~Õ¶·‡ô¹-œ¦> dÝ ûWöì96ŸQ̱ÄßNŧ„Fã6f˜AªZÉ)W„¼/ý82'õ%ÕO. ïêMŒŠ›ÆT¢*®Êâ¿Yt¯Óò"ƒ¡ã w ãî˹õ-ò :{zµ\€¿só¸M]DT(ÃÚ]j)Õ]¿1ß÷–GŸÇŽíŽÁ‘Ýù¶P妹Jí 5ãånw® ƒxÙÖy,r~½mÔ/Øð^Pˆ`Wû4Bæ¤"1/®LN YºØ$<ñ8Qd* OĉÒ$e[§Tï̼(”²^‘„¢K¾ƒCK¨A:œýî´bÀ­Q 5þ :m^ ©ÂbÄ~JÎÜW¼tÑ” DMyè¯]†QÅ”95ÿ=ÿöÔb<ÛWû BÖ³I? Q;׺@·Zz¬'±÷U³Ó¥Ù± -Gí^&Rw»Ñº͆JðÖ_”à6ƒ´G–Ôó{U„"Îî†ÍÂ%‡”nø•¨âÔ´÷&˜Ì„°Óß_]4~’(?={÷>³Ðz ëðÁÓM*ÅÒ\q¾#Ïs"'äºVϳf£Îrup¸²N”“»ú¶„…oNÅÐ:(´ ÇKè2´)Ç`I°0HóBË££h¯Å¢ÆaeøxèLJßN't›W™ïÏñÔWkÂešžë -¥/GÛMÜÔ0ØÅË›vR´z$Å~ÔÚÁE¨©™GEHCÆÓ„ƒYìScØ[VT5¸ñ—qä å<û Ã’ rÜàÒµ¶¹ pT+ßëBoI ÂP4o¤ñWða¾,jô ªXg~¼'â -¡4§›{Aþ6 ¿Ã\RóÚÅ«+„qºÞäWÇ">nþ±õ Wºdö¾ s ;û|¢€ ²‹ªKeb/;tKGC Òl›©`Îõk7*!VÞ_‚–;f5ŠÝ›¡û&æÓßb^=¹€2§ reßí½F­â–a„IŠ²E"2’õ¶[çÓæ&e¥|Cõ—¢C+TRµ’Æ‘O¸M´òÌׇïÑÌ2KvFÄÆOøä ý3Ø®ûŽîˆa™WŠª‘ì¶2*´]Œ__ôkbâá]œAIhÂ$ÞŠ‚¿ÌÔj{Îþ„¬G¿®tWÝœºçzfD¹«Ý„Lƒ¦B’Ò“-¥o"Tž -ÖµzœG{îâ“¿…L9–½m#”01›Ú5ÊC”K³˜\4UY ƳRצ‹È‹¶Õ%ÎLÝ]oRŒu ÞwJŠŠî'yïÂïǃ”ìý¤nw:2z½ÏØÔ85œ!IâÏÿõû+¿eFœ7ë7ûR/“åAÏ(ØôØ‚ú?ÆவÄìS“uÉ®âÜwÌÄçì“Ö®\¯¡khñU¹Ë]Žªgÿ¶—áßþƒ6Ž÷%>do .:SF6ï,–òì?Ô‰ç4iè‘£E¿øœçäÊ/ÖE{Ý´ñõÒ3‘¿í÷c…ó’±úakQ6â <"Ð-Ÿ>“\à#vÆ-÷:›MŽRôÊ>_ý ¦±"gú¶'5Vœæ¡ëß|c¨V亲Ùéƒ|Uèüãí,?æ ^Û—0)$:UE„ªïX:o0lÅâí·N˜,òÒ¢V>s›÷]÷ÑÐô*#%?[…&rp°´L|F A·ã,c.®¦’ÉÜEþÌÈM!½0‰+å»K­‘*ÝP¿†Øéܬyã:Ú"›‚9¥ý¨Ú9Û !¥>ŒÍ¦¾¥#ZËÃZÒÀB”d»ŸPBÌvHÄ&°ËX@HâÒ<¥J ßÔ&‚Mñ’’ܶ­y<ûõ@ãˆs@†øp£è×üyÒÌF>⬠-MN3±"˜|4€cZìu.Íà²0‰ÍöÀ…>™Ï] i Ýâ¯á¾h¬Ï”(°íÝÌ"©È]œ¡jTœo‚‹BúðUõ¥§Õ­ðÀ¤´Ìõfù´#ôÈê’TA ÊÈî ÆOÙ\¢¤Ö§¢Š8š<>¨ß°óÞhÆ€cì3õ~ßx¢IJnHœõ„¯³ ó;àÓÐÂåí8S¨=¦$E¯Í)5`Xha‘ì@„6”Ò«Ƥ%ý¸çoMŽATm2!ÓE;šS¾dV¶ù1°î¾¿Ðs>g"u«èÙXÈíIU -BK²&„þhlRÈ|÷‰Çð”j;¬Ý f9"øΕÊM„Tí¡TZ*,cŠ"p<ù¡‚oidŠŒÄ>5†×]c -q]bdSæ!CÌàŽ%d"B’›É²äËú0Ë‚(séÑS×2³YPŠ}ˆ€Ê;¹û¹©(T–|’ïS?¨5.jA_477æøð`¾Í©y„¥;ÀÊBÒBƒ×ÿ0,L6™kqÔCëYû´4%eгè!lâ²FÍ꺼[:)Ž„„ nï>³!_5,^¥ -’Ãdy•-Õ‚g0(6Øù;iÌFˆRúÆ\Zã8 ‘*¨&ÀLž».¹ßˆæ wYÜO ÇÞ‰t²ÃÀØšd -qKõèJÙºVš]3m0Fƒc¤Á¼ß¸ÑúR%›2ŸH_RñÐ=ZÉŒD?~sä6V` ëNGw'"èC7WëppƒùçªCìÏÀ0;ÁÜ”ÍÅqÇï\÷¸îß_´€ñ4òûŸ”!èMP¤Îr&Ãù#çÖ«}¨íõåWÙdá4ŒVJ¸™ÙÛòµ±šX״ؔà +¿‹¹ç¬¤Zá{¹]—'ð’à q!Q£?¥”wŽlJ‘ˆ'@ÍŸûœÁŠ×4^«`ë+W°U)L¡7ÆÁ˜51Þ*¼I_€ºzA¼r„tÓâŸLœ¯Œ_Á¬#’ùsOŽì€°Fp¤1a—Á ,·ì朦éfŸ})*D-v |ǃ°Žà’« ~2‹D¨Œ—†A„©Þª -âgèÎK/A뽫"B~ ÕŸ2 ¢¤íj[¼¿7…¸Mçljݭ˜áŸNïx‘*w…µk°¶/]U†FGaì¹²@¨#DŒÖ•¢­áÉ­ÁòÌ´S´U;jŠ&Ã*Ãgëk4³T|”N»æì…ý ÄV'‰ÄÉZ#V=ྰ4NF2&eœTUd Ó°Ò–:W­S—¦C8êäõ,Å;‰Y?ºüž&Ñiú¨ûU,‹pÇŸã2欬ænÆ­ÏQ¬²göF†ÍÔ)èi^žã¹Ž'l—Ù£pYŸ,¸`ÙJóÌ°o.DŒç]éÚÍ<[Ù5"ÀbOØt2÷D!goQaÈŠ–ùs1Ç”ü{eòN½%žM8ZrºØÏ¥—)Ñðç/\äé‰O¯/cÕ<}) ¹ý~í=gnùÄcÒ‹-ØNˆOTu¾x ÝfgŸ¹ò+Ä}¢.¦ÕÃQDÌ .T;YBÓ¾£×VÿÌX÷UņyÓ{‰ÿftã‚ã°¼.ÈÚ^@Ó-qžøçy|FÒêo>~5ËéËWTf6~ÑföåW¥ØI¬÷@P]M¥ÙÞÞ}`À/Cp8ˬGõ³Èð~c½èPÈôüËœ0×õ åËe…¹÷fŠžq{¿JR΀¸=¯>å^FÀx(N¬k%è*„³眮–XtüN>W3‘J_+Ur,~€ëî@m -AOyôV”k£\åF¿~©=¥&Ä^€ ž)ŒüÝÖ%çsõ59jg:É‹û+‡K5Á‰”2硳MÚM¨ÒrV€øQÄÁÌÝzÞéÛa„¥¨aþìÙF|sng -dÒèýqj¹íìÕG ×´ìŽ<óRDLŒuð–ܶD;]õKs”éOçãGƒã –¤2ÞARÓ<ÆeBa.Š…¿ßúÉÈÞÆ~™0?4u¥K¼ÅØ­rH²ÊDþŽ¼””}3-BðeÛø(‡ 8éàhÁ!·­'ˆa™ÑÎ\yÔ[ÞÖK¢‹^Š×XY%¦WªGmUçùI®Té)Y¬ßÑ%áƒ*4À%âPêöhn öµ­zç—¦¬£QÍïK9L…º€JV•– {8ËTÛl¥”Š'|`çÌ<â¢]ð.ú§)•¶„~Ürgøx|]§Yb*Ø´I—¬w/(”ϼ‚iÂw/ô‰=Í<à5/*ßìõ•tGÓV«u“J¡LH#½èƒ³è"z\©•êˆTHø»ªSëž7ƒâaù©™Æƒ(kV³š·Ÿv÷¯E`x6~à … ªÒ›„Î WÊòzÖîÖt­å4 -µÒa„?š¡äK`sxÂØlì$ÖEäߘ7Aèyrñ€J?Â,)oö*«"ÓÃÝÔ\p'Õ/<¿"þžnÆt0mØX«ñ,Dïÿ<×€‚6s¸w¹_”™À}än뼟ûy+€0vsl“½ìGâ.rÇ„Èð-¢9Úo|­|ÖïÍxåºùÉQT¸Û½âö\}a1`³‡º/£0*’ìêú£À¥K´ù„~²•ìx»~‘¼Æ±LvÅiÉž]Ã’Íq„¸ÉãÜÛX¼žíÄZhÖÃ,‹‘»  Ã!^Ù°)‚ì~E'¯.Wbû8±c….wK’¦¨4Ïol½ø‰“×x³ì‹¨„)tùV“0“{–R4H¶it5®ož)Äý|®¶q’ÔùËèùîg¯Ýb¶MQ=ÓD Ÿ>|Cß`êä0‹;¸ûãÿY -¦õì‰A;"Œ§¡ÔÓªC%DûsŽiQ‰î›Öÿ_3ΊÙvÓÿÊÁ²ÐSg‰Å‰›c_Nj¥{ðüv¼Ô •Ñ yY°Šl¼,ÎvA»±&¾€ïÛ̓k׈ÇY~Z¸]£ZJŸ€÷>·\ócT’“VhòB© -oÒ':뎨!uß³Qœ~>L|Š%ÖX¤‹"ŒöŽàü7KaµŽƒ$9y5(ø—軀@9[T²oê]\œ¾3ÓmÔ§›¥hž~$ ¯=pe°M­Ìz”ã=‘Rb°üc¥©«bIלh'EˆKüxDgŠ7—Ü"œüTî€Àæ8t#…‚æëåSH×B;„…šˆƒ­Z¸©Ê‚˜AþwùUÖoƒ‹Š>íà¡C0ˆàج2cÚÀí³¼Ñ¬|ŒÐ¼ò§w ”Ù Y¦ ¤Oxu3qñ5¤LØ£[þI‘kJR•Í™ž y,«”Á'}A’âQÑø^#›6›[ÎùôÖ¦s"³6a.?vá|M²eÌ;L»¨ÜW±õ;ûê0Ÿ gv»<Ás_à»VBCàhéO½›°Î4ÐÀ]¸£#W" ©3jRÏ^´¹i™¼Ð)v×ñÔÊlûA#ÂZÛiP­¯`Æ*ä„_o*[l,´TkÇ…JÞÓºäç¥EnM8ÅezîÖ ÁÈ*dìeÝ7PÍMcÇ]’Y¾ÖžQ”š ú–Ac ”H -FnǤîã0rûß{'ߎ›6r”‚üª#Íga -…iWÄó¾3 g€ÿ Á<ô‰öFZúŸ8Ð2:ðel‚,$cnÌ3îD¹„Þ©âèÙq"éš+Oa~ÙÙÀÐp¤ýbp°ßÛ¥g°¡ìYz\°Yÿ¢âj»ÌÁÈ?ÒÅ„ö”³°—f–8A…A>ë w†¶*к½¹³?a\ÁKí<:ܪ /`8ž”øjBUS1:ÿht@=]0ZÛu>¬ŸÐ‘ᆵ ¢ªs$9_Ñqù³¸Æ€á”‰Gµ%ªÑøÑT—±¸ -çè´ç&S%“ŠÞß’ö±â[ÃXúÕ«H*Ìö=.¾À¶ÐJ„¿"tÛÿ -P¥—néƒm`rM-\*Ø}(Þ×ÄùùÞ¥ë<Ð?(§×²÷/mú •ï%–}dZ­‘¨rÍá]DXJwxí{ºÎoEexòO¦ú½@®÷儨oñô»D9—aÅiÂÁúZ|>Æ2©‹ÄO4sôe ¯“Y9ù7-ve¢qöšà¯¾z&´ò” ŠÅU–¯«…8DœÏ3¬2;WK1!ãc½50èIŒÑæEí¢Dð$K8þë÷ÞØ|øßë -© -´›ÌèÜ?b ÷+~a æ$ -n"‚"Rô{í"”õ¤ôØHa^ž!ö§[LÔ ß'“é—„'ªùã²dÞ°ñ2¹Â_̤«È{€,̽ÿÐôŽó ± ŽG `‚-ŒSïîìr )FJw­ÃG e´Y‹ô.ÒÄZx7Yй²Üt⸡ÌàžWGAbѪVdßcóýzÞ×#~RÀ(S0ù¬„s¼såΆdnhÅ8 èÝfi bj„ðjƒÖB®+ 5Í|K W™ËS§j‘†¹«¾åœZ뢟Œ~„Vøƒ²Ú æ!¯˜ZSiîçÚ³áõL§tb&G®¥†œ¯l¶2•ŸIwxnä% -ù$1Dßî<¿ÕÛ-Fž/Ë¿W·’Íã,a¡ž•½~û_s\ä´6r­Ù×Z‡«çŽ­’©üPù=þuDI`³]åã8ÍL¾Ö™¹®'µ+Ñ ëGà+MpŒþJp¿<–°gÓ“ã/šEŸŽrjŠz €&dí]Ò¥ƒ×²*¯G×¾ÆeQÖ7Tfúr¶soDpÙ^)\¿ÛÐϱŒl“Α0,vbYTÔ !çÌ‘™YbÈØÚi‹0µ?—ø YßaÆß-/&ÍÿD(Ù™xWö¼jJØ’nBðtJ°#nt¼w«bƼ}YŒSК{°mUº‚U}†Ç%8¬­æíIðUêú7‹þ{âV‚B"ùçÖô2`©fzù¨-¿Jcx`=™£ôÞ¥•`LrnN 4´äa$šgÌÿ°|†oÝ%»Íic°A=òyéõñ_æHëI"Ƹç/ð_Û¬Hµ%|ÌÀ>5YÕVMs?ñ(‚Å@kŸŒj¬¡ ©h^O±Ì§ãp×GƒÛ&Ô¸¼Dc°ŠªÅï~̧D¥4( ¡ !î…‘†Û_fM®ÿõç’Mv/K¸zš, ¥ÂG‚kÈ”\ÞÐJbͦï\Ѽ‘^p€Ñ@*§e†Rò¡3ì«(J’”y¬Ve³Bßî°ös©!“: ˜Îð¯ì»¾«­Û àõe.ü0é€]? 9¬’þÊ×T³øõ܈Öv‚°´\®l›#ú©Z.lÎ1­6Î_½ªÒ ƒEX¢½”TU°Þî¤r&¯­Ió›ÚF)Æú¾¼iŸ£Å,3±±Æ….t -ý¥ ÖÌÄ ïœ uåÐóýÂîàßL­6†f 8¦v*1ÑNð<Ú8+{Á€·U¬%胩ÃZF!K6O0?\§Íý,GÌûÖU臑\õ¹ÁgšñÆ?=vy&‘~°¬œ{®‘åO1.—ø,€/-ʺh²¶Ôí> endobj -721 0 obj << -/Length1 1647 -/Length2 11596 -/Length3 0 -/Length 12440 -/Filter /FlateDecode ->> -stream -xÚ­veX]Û’-îîÎÆÝ]‚Kpw‚o\6îî.Á ÁÝ%hpwww‚CÐ`snß¾ýÝ÷úO¿þ±Ö·fY£ªæ¨Y{S‘)«1‰š9˜¥ì]˜Ø˜YùŠVv&®ÎªvŠ|òLª@ Wc[ÀÆ…@E%î4v±r°—0vò´€f  )€ÀÆÇLJ@wy:YYXºh5Tµèÿeùk ÀÄóŸÈ‡§³•…=€úãà hë²Ú»|PüÕ€@€‹%`ne ˆ+)ëÈ(Jh¥5Ò@{ ÓGÊ®&¶V¦y+S ½3`îà°ýÇ`ê`ofõWiÎÌ\¢Îc€3hjõáô0‚þ‚  “•³óÇ7ÀÊ`ádlïòq.+{S[W³¿ø°›;üÈÉác‡ÝöA¦ìàìâlêdr|DU–úGž.–Æ.Åv¶ú€æ;ÍL]ÿ*éoìƒæu1¶²w¸=\þŠe˜Y9ƒl=?bœ¬þNÃÕÙÊÞâ_0œ€ÆNf¶@gçšî¿Nç_uþKõÆ ­çßÞïúϬ\œ¶æÌlì1M]>b[XÙ#°üÕ/2öæ6ÖØÍ\AÿÄÜ€Ní_=C÷‘„±™ƒ½­'À hŽÀ¢èàò@û?S™ùOäÿ‰ÿWþ_‘÷ÿOÜ×è¿\âÿßûüïÔR®¶¶ŠÆv ð9ø4Æö€Yü5ll +ÓÿËÕØÎÊÖó¿sþ÷ÝZÀdýœÿÿ#„¨½Å‡BLl\Ì\ÿ0[9KYyÍ”­\L-æƶ‡÷·]ÃÞ èdkeüùïóýpbeý7LÝÒÊÔÆþ/5¸þíÍþ½†Ýþ®€ERRZJ]á¿™¶oVþè -uOð‘´Ìþsñ•˜˜ƒÀ›‰›ÀÄÎÃúq?®#;§ïÿ#ìßDlÿZ+»8YyôX™YYÙï>ÿZ}ù7I{S³¿úHÍÅØÞì£õþÓðlêêäô¡øßÓà£ò®ÿ¾@ ÐaeÑÁT Ä:=+Ã¥7gp\B¯·› r0TÒ ^˜PíÐ埱ÍWaôRÊÜ8ÉÿÖê¹pzÝ—¥?îƱ¥éJ^äùRÐõä£oP·ó0±” gœjÅx_ÎËoAér³j쌫¨¿ÀO¶s8Á]>ÐP¸å`QÞƒPüLÓêã±¢5‚aÔœœR=~¸§é躆îÙ'døO%à…LàøPXW£Â;SAþGÅä\æ ×*IgOzÉSë9m©Aæ6ÙÖòIA»€œüþÀWH -ï<ø7…x°º‹zîÊRïœûÓÃÖäb„»EŸq±Mw:}NûÆA†u’æmßòÚ­fN«Äß”pçf¬­.¸–ü7^ŽQØöÂöÞöJÌîÊ‚ËLk·^‚S·ÃÚÕ^—ç¶dùÁbâ6)BRÊ?<Ž òŸ"OíÒ­ ‹I ¢SwÚ‡Y›%¬°Qk¤—$¿ÌÀàdÜ˔95.]¸Pì„¢óBOužÃ€æ5ŽDû¹ÈZ_Å$Žz^¡é/áó¡a‡éÏ &çÙQðgB儤¬”5€^aêü“uM*ÇÕ†Dâ€:šÁwi˜!(›vz0ÌíŠä«^O)m^ÇY§.%ÀŸãl—/Gí¥¡ãðmNÛw¬çŠ3ar‚`~+`´b\<, Œ]’P‚çG ½Ø'Œ p!RDNO‹p[ËjyQØ˨™kP¢ ¤¼9Ÿlv¡åó :ÛžÇiZO}îsÕÊRwW²"ÎYá±äRý³^~ÊwöHqgÁ.†=˜a½gÙÔ ±Ä!z”êgpTBÊi Ö;#MâÇv¯’·™šf$’H11,£œMÑL,Ú¤=TW¥YÎɆLz¨n› -¯}”øÍhN·>"Wøð&uÕ~DCr¦_¹5øK©ï<º$$WÕç„£ý·¡/Õ;QgÚ_²nñ7 - /Iªƒ"ÙðÒ½O¾sêÓ ‰æ|Vk„æY&ßSºÞî ÅŸ%¹‡MÇÐ9ÎAÉ_‚[’âÕ.W tÍìϾÝج‡Ï÷x3ê ‚«Ì½µ¦Ì„nRÝê"´°Ÿè7m@ƒWÀ µÓÜ`—×v´yƒÿlom4túÌÇߘ*ŠÐª‹±¡²lëX;c£’«ë¿±‡Öœkg|ï ‘H{óô.Tö}שּׁº•!x\°o•…Y4ÇätS29Å ÉÅàŒ80NÙts¤—ù\ýòƒ…¥¥F․Ù&Ú’.¿l›ÒÆ!eU„\ë ï*ßþ“ÒF@µ¥m˜^}fCëí¢»#Q ׉7E+¥åÇ•ÑÝ=Ä’3.¢ß½³‡º›9˜GA77c8™œ­*ôÒïð?Ä1“ª,±Uq±Ly7?Éó‚1í’ZЗœ]»ùyÈ‚¸„T²¸÷ÆÐ7îM.†·Ec(¿P ™±é$µÖ{EÒÌÁÊ.ccÑD ˜Q”‘»T^”Ïg¢4—K Ú$=!$Yɤ[… ¥PIfxèCòª¥»àsÏü™7$ð&$ú^Jݸޓ®±}Ë|†{€óÎŽ/XÖ嵤 *×Tqe#Α¡…žøƒ^çîî8 ¢€â‡ÞRÆŸto›{_uúTÚ"L­·`˜Ó¶¢P ì͸e¿I‘F> 6|žÛD)¬¼Ãy ¯Ã?†òÏBD…”„õ,Ý­>ï0ÃaòMtˆß­SŒrNªKBTŒüb‰Hèý _L?µZYH|P9ª—Òfœ’XXˆ4ƒÌôÐ B’Tö¼Ænú6%ù¥¯QÀ|ïÀ"ÇôÏŸÓ‚Ï´ž]TŒ2ˤ(…W<{ ­DinÆZn<¼Äçó5áǤ?Z† 0­É㮺[@lÏdj›‹­óz‡q?ªDråÊœÎì†Fö«NýD  Ñ~ÇJrë‰Qãu_<|Â~Œs7bÝ’¸ÙµRchwJNXgAdÁþ&ôW-M4¾¬LÜU[À Ë{™JÛÞ)²µ™y‰‡õÙ†çR•ˆ†O¸¬ó¯Uöˆ·ä…­%48ïymA¥q@T¤ax×sTõåÿžŸzš1.'&ñû&yCœ$/}ÿÄq­´õ’‡®i‡Áx5ï-@õ߫HI¿'œã÷÷²6 ·Å—µ:ˆQPÖÏŸòþgÏo3ƒ (È”LË-bÂd -a`‹cÿ¸Ã’7\‰Ö¸Ò%1í§¤>H|€é -œŽµ|HBÀçýJÍ»‰ -#îÕùH$ËÈöÇ_)2¯—éH²‹-õZùq¨JÜè80c”¦'8jiKâ8ÝÕ‘,Ê~¾,bn;Öi¤¾( ¾oçñ0ÝxÕŦi‡ "¿°—­t™Ò¨Úƒåpúè‡ a˜C¼ú©Áí ©…ÁŸé¹{©…˜~ÿi¤c©JÏJçA»ùsž¨H†,QÒ¡r4›L[=~Õ‚ :É@7Ò÷ãÉÒ]—èå¨ÈÉõUkͪGÄ:ßÈýè_àÁÜcEÉæ!„îBT½­Ò,¨[=q_ïuVÆû÷Š[+%荒YÆÍVawÚ¼Ða¯Êmò—Å’Wv Ü -©<Å€WC·5œÃe4,qÜ8_¡î–“Ä@À/yMÙw§]jO¼“ß?Ãá³›¹ûØD-ªß;³ïxùüìMZ -›vSC)4Ú³'§œÆŠ‘ŒvÑv+zÓÁ¨gÒ‡˜Ùfæ†<-¾IÎQпk·kFŠØ¥’é~ä%'ìPÔcî‹o#´3$šâBác­ªV•iXÝ%¤QxÞ®ÆÑD|×ôÂr— „tÂëï0Œ–AofÎõ4ÈûÎ8“9Ž+«í5òU^,¼Î_³ÆŽl*°\`E˜p;Øì€ w-ñÛÉÐVØvéÃf°‡ŽMØØÜÅîýxbm ýîh£Õ){#ó‚N팊'»¼tçöª°Í,Mk4 ¸“~ÜŽFcp¥R[^~¢Ì18¹1cu¬È;ss}wi[Žu#ÕÓ'ìÀd?X/‘Ô†¶òÝÕâ…ÍÓR»S±’3î ‘°ßp -BQûÌ‘ -þ§<)¢aw±È¼ì^ ;FIG9*°)˜ðÉ2nÉëyubKÊo—6åĸ;„Q™sY<´9)Dâ}íc—Édgïœêð‹î¾ä©”Bø˜³è„=©çœn´SΧR]’Ñÿ>ß­-¯H@èXÔGxYVNïàÈ;MòäZ“sü¥iŽ„Çûæ„„²éð%…ræ8öA'3Í`ƒ£á qé&¢Ö8†t^DtÎ׶o &•î‰äF/‰SË+’1%GP•²ÆÌÁê}éä0âÕ<^x>9ï •ázÑ<ÄçÑ“¢€s )[0¼§H”ÍÞÞ»ãí:zƒTáÉ»B6'\ÔÕ6mÞºœÎÜ&c$jO»-Ð&à!Qnd|éªQÜZ§÷Ê#S Ä$ø¤wa€»Ã¡½›½lz”*(P7"øMó=‡‡(èM(Ì<ߥ9غ Ûj­êÎÖ¹í É¾ ;F‡\ß´Öy“\…xÀ ZiÉY^ëúÓWplcܨ¸ô¦k Š1ù¨‹ÝV=jÛ–&QèÓÍŸ&Ö¡<u Ž`ÙeÇŒÙ>iÉ-æÀöËZÓ¾Õ?b¢f«ÞPÔ"V/å » Nü†í@DÌsmÒóóLzø§ÌÕ4Æ)îÞ9Ñl&²Î÷ƒŸ]8ŠÑò“¢Vöø«ãÁï›~J»¦BŸzÂ*rãõNÔúhª}ÀÁÁ²7Å›Á“}fˆä6{#ÏFؤ:z­~0¤MÂïàÅKªßÅÒp=ïMl2-Òçö¿DàPÊök  WŸnÆâÐ.€¶îó¼*xµ/`F¼ûº%ôÙlÌ-˜ïLd„Š&ÔÅ"Acƒ½ è"Þ¶îÃŽÇo»£÷¿u%#[cŠqùB°Íe§x´)Q¶“l¨NMðÈ)Ì%"›>¦|y{÷úQ}‰„óuöüL“V¦¬ò–¶¸^„ µ[,úšŸãMæmÞ(¢žê]¥ot¦´-s©ýa+ç¼Õå‹`¨âçöãælâ4«‡×e½N–¤É¢ŠQîLÛt­<++bý£ÎBîך¸­†Â_²¸0ä+~o‹ËŠ@u3›…ÌOWØBHö&y&ÕúïH…nü57VdÔVÕƒYÀQß\°ŸÝ´2 ¾‚˜ñ&”/wηÐe ± ± -f]Üym̉±Ý^G j^†ˆ‡–ñûò! -\ÕžzŠ¯ S„ê£/©Ë:õm2sg~]Dóx (rÐÆÿVŽêúÉû»f1ÄÌ“Oµ…®­dŒPyOaš3§Bº<=¦×<Ù}îÍæn¾™‰“h£ÉMG-”6²I‚§p2AÿÎzªð”TÑççe;øKðjÞG¶ÚOÎP¢åÛBÒ“v滩Å1tZÊ] 'uÀ)¸åveÇwÄÂWŠÁÚ‰ù- –é7„ €l{j£Û€~¦_Á]5“‡ê‚‡_úì¥æh!ôÞûFfG‘Ö+M#F)ß@þÚ:=̹¶a¬Ì {-iÙËóg%˜|BzP¥Ë¶öT•û°éçP=×å׊&™ØãZíµ3ªTGÏTS,IöŠð ÎYNL’bvãÝ"µÂ xéŠdï[æÇú@a¡@Ö=>ã7`C²uŒ6²ðøïëê½Ï¤¦j§Ý4sIzsL‘d™~:”Õ@·%/.59Ósž9Ë`: Q4ä%!Wêüݒɽ —ßP\!“D°è;A‹Êˆ +2x«¹&Þ E,;{&!?&¿ !3y$ð{Vìþ±T€øLÌY¯uoÍÀ8¡ŸÃ÷ò"jØ@aÖ­!Ž|>y/%˜ùê‚òWïoycöHÊϦ’s9—(uÈ™=>··gKšÓ¯všÃÐÓЯSÞH8èí”ôú°Þa¤r$O5zTƒ.ö]éö8ÿ_­ /ñäåðD𭇊#ÞâH¢È8Éé­9§ÀýæäTðŠ2Õš$iI™3.‘¨’/E§v ?à<÷›q’”¶fPÞ«ñŸÈ9'!Oì¬geGøíH›3åëÅ~ä;Š} -¹t;3¨Ó•o÷—W÷jט§$«7án1šà?O`Ã_W£&f,÷QžóÊÁÆlÊh¾lŠ¢jÍÏQ¦aH“„Çï»(— ê«ÉŸoߟ>L&ð+‚„U‹`Êä`D0§¿Êb2¼`£IÀì‰ê™kš;s%u8/êr(؇½`RGƒàGAþQꬓXÕZ"¨É÷:qì¨,M”j‚ö€~$]ÏhàÜíäù4“‚Jz\êN¥æ lÃm ÓÁ=!ÿî˜ÄÉŸ²°Íæ¿>éžSÂÇöô<Ó²Œ+7Ÿ„°pk›º¡î”÷¡JãJÁÏÚ¶¶Y:Új^Œˆ]š µkaGAy­žº;šiec„âvê&¬æÇM©àâúÉl* v°¦É¯]gÿDµu<7“øOÃ’î™Ö -–h ßG\N Ù1Pkõ|Ú¦«sÀ9MÿðÙìmÊá…&™Ü`9²€áî£å[ÌSþª$1œâ6ªàþžúº·Ä]'ÙU\¾?âàNº7çsóìãú…PŽˆF ‡¯þŒñwC@ó}øúŽHË­îg»Õúý;À0W9Qú ‡±ÉbL@ŽãœNáÔVïFœ?r¯üûVo_ëÜú©ÈèéXí(úô•Ú³ðøì1Õ…u $´Öã%¬—âëÏá¥ýnØúŽÓì·Nº¯Æ.çÇvë_BÙÙuûcˆO`ì’qFüýЊ°KlVZ;NëÉ‘3IéOkv¯ËÕé¡ ëYjâH€òpŸ†.ÐŒ^œü`Ë­L äIúìr„Š¤Õq±Tˆ†¥¦¡#Ým°ZviûÙ‹–ô]æë8èk—Æå{Èùe“ çm -Ê_ùz7ëœ;.AðÙ]&¤vñâ%ÔJa-ëâÇ('O¿qʸ ²ýOÔÉé6°ég¾±:âQ1ÛS†0V£{±õ‹;B!HÙS'± -åMŸL­ºô¤äÁpu³ºü <¼X“ú{³±dJ¯lpɵJÁį\„Ð'9ÿÉå€;k2…Î%!ª,ôh;/e”Ö–^ºb=^¨ÚQÑ:ÄIÝM°UKˆ¯`»eàsòQ¦gb»Æ4”ݬ3—HZ¶ñ:ùþ·óÝ~NÜó(òÙ*ãôBç맓¸Ñâ“j˜ËCwOfðm³]*§b§œDÕûµT‹¬µ>x}÷M˺ˆBž NóÍp=ö“0Z¡ËExëýChY¬Iðƒ¿ýŒ"ø2ÿÚ-ŠH‚h$— #(øjV«UgV<ˆËŒM;.†àДä -‹­À“c%=¨ïTÈŠ¨uåجØ&cD=å ðÚ\ܪúIÔL ­é p–Äh4ç¡Lzó–Çù`tudá ×ÞF¤iŒÔÒ^Ñ4 h fSFÆ`»\>õ%¤¬ÚÜQ%gumÚž'Œþ–dÊU&9%ä\H.ù6u؃Phå9Óäžy¾í4‰»ÇÝERŽ“ÑØL])š‚²{‹8 ɇôÌjì–¹0u[þ”ŒQqÁÓ)Q¾/M¦dЂ\»9 Ä HkÂ-ÃKŸqÈnh*‰Æ=Ôóu8 -Jþ·ðÞÛŸo ¼èªÎâSÃÙËÓV*É+5{æM¿A‹ZÝ¥’’N.òÝ!é•´èMk­À>dL!V(Ö«](¹‡öîóÔÛ-Ø'_º4–ÍsV!“½oÄ®=›=‡¶Ÿ’`ÎM¾²TÚRQ§á~e·€åÒP*>½Û§”®y–qPq¬…Ê%¡‡/ -»¸Ÿ‘¥í#UEº>-üù¥r¿ª7ðV˜Ã(3À{ -Ý3ÿðs3€nxs#þÛ±q¾'%yT䶙~?.Å’\yªÛEk›ÈÀlšUýS“Ø ˜Ó1Ø}f†‘¾>3vlåü -˜âoa^•lü/Zþz—pu“£Ùœ~PP¤QM -º/N(Þ=¬¼À|L2œ·ù™ø÷Ž³ÁgÖH¼îØ«“¢¥írÂõOdc“Ì‘„eòx|¦åKVÏkr!Ef¤qû)mÔ)»ãÂFàÇqŸl]o¿TCªÅ§ °3œvëHcÌIž?Ï—âP;e%(ñ-R¾Lø§”›‹8 Û€H{ñ ÃcL˜òV#§râðÞØ(邦“Ÿ¹á%´Gu¢UêvONô±§€®ì·¨è×­+mK }8 -†>§|;Cò}UC›¥wìôQdéÈê•y2ÀüúŠT´ŠP¯;jX>Íß7³gÔ?Ifâ)×ò­pýóÜd!÷ç˜4*nR›®|{—àØ¢JNRn±ˆ»CsÁPÇyƒD@˜Wé:ßo[Ò¥÷²Þ7û°í«·g9Ö¼ÑF¶Ã|n»Y^M¨¨Ú”{ƒŽ¼©U4·l<¾ONâ«â¹¬ÅݳW!Þ:ô~ºI£:·Íé€LW¼np²ˆG*úæ:^lRqdä’#iò¹Í*w±¿¾X¥KO“ òÑŠÐQ(æ"hÞfñ–è=\Of„5µ!KÁïøΠ8HVùNy‡!ߥëDÖ`¸ÉcC—p‡ ¼f­¨7f&Í¥‰NóqöÂ[» jéÌßüíÉ)tûÑÕ1,’ ¸% ’Ò%‚-½5 -»kÚ‰‰©ƒgÒð[‹Ùô]ëÑšõÔG×6h•gh¤" º[ùw0œbkh0Ýÿx! -Xܳ>E¶ÜHšÙÇ[„újëNRåiW/ -Äï%B"i}vÃTŸõNþ¹v©‚í`oÇEÈ"Ÿ¬jÉpá·-Çb’vmàgïý]Ì~íN¦AÏ8M]ÝÙäíÎË¡YµÌ‰ÃóP ÎtaG^?=R·ûè"‘ÌÎd„1×ëC}A™f©ÃÓƒNÅ+~(?@ih“")AÛõ…vÚÃé6þÜŽ˜¨µIfG$O†É.Á -Œ/köáGNJ¨³ö]”´L[èI/­qÀ»^”`ëôø!Ìû0„×s—þÍp×ú&}ú25ù0DËè;}ﳇeÉ‹ñaãcŸViÆ°{ÞÑÝ ôð;—"O&FÚäHEì­àO½Æ’q1¼^É«ëc¨¡Îbéc3•¿ê¡¤ $­/ -q‚;îÇ4‚Z€$ -ƒË6K´¶$€TQþ–†‘ã¦Ó1Gø»Ù1 ¨ÓÚyÞl \8D7Ž¼çìÆùánр̉BAz·ÄÎ(]ßGŽ6«C×½,ê–wÑîJxF‘¸jž5"|5†üxtˆ-c>©ÝÐ -ê§idн"Daª¢–tÔ¡ï5ПX -/ìuKVg`>®¡ŒL›`ô†}õËYèõ¶#¿pÏ­6w™)P&‹Ï}É(´ìÿÉÕ ÃG³‡Á 6/Y.÷Ë[oNÊÖ2 F]êÈ)uÕ¿òÏßòœ8Á¬%É°QÔƒ„dvjÍtœ®Þ7Ê?þÄŠç¥pnp2¦ù˜%dø³Ÿeœ´RËÓ…ãä°Ì¸q;ô=DmÔ 3üÆŸ ?iwZ®øCÚ,"+ò€]†²—¦2_­Ç]´^Nv9e(#ó>ÛLÂ(»ÙÓ•d.VVƒq†öò戶òÉÛ«—‹R.¸/¹äãÎGzQ£ábo…’aHî†máCÁˆ ;g<°à:œ{Ì¢“£:ã·ïÂRÉQöß*i!íWIÃhV_Ûér¢¥X@˜–Øë¹wò¼¾nò졶!M5P£o¢Ÿ<×¥;ò&q™B«Â'ûXs›C/w4nÐ[ðl‰Ë¡?“î' Ô-„7›ð'Özä‰X±žc×iûT£:dÃFçë‹Ï ôãRÑﯭ]V+°F^#¥Lb9ù"z,ÈüGní`x°ÃÌ̯‘-â’°ÓžeϹñr°m÷¼EË„»0^|%Æ—¯l0ƒAÛ+í¦x}8·*YMÍÁ“ãáÑã¥1•#UÛ`+ôºh8bE¡ºí’nÕH ƒ ¬žaUmÔ¬ „Tj·ÂdJJ<Ý]„ˆ´“¿eXAdùÊåml,˜ -ï}.¾‘‰Œ‹4å–EuîHðû9ê=JGš,iÇŠâ9ñ˜jsÓ:EH;Ü›¥Þæ7§, -BU²ü¤ÞËæßÇ÷Ž¼‚…ž­3©VyÒàÈ|͆ÎqxœÃ ÞˆÈüªÏÈ’Üj±6ÿ:ÎؤmW|Z­–&™;ÂQ …šLÈÚŠËcê¦-ämÝÊ¥s>ˆk-¹P §õ4’FkdÛW)Z¨t ’mêjOÚ+]h©‰gÙ뛓Afw*ù„à}w lð¶éÁ’wÚΨY9¼ž½ÙcYOHŽÙšÎ‚í¯¿¢ƒÔ”hSˆbØd~Â(}Íô‚/Ž<ÌGÔw’]€WÏ⎲™ª©VŒÅ˜Û§¾TžDØI‡N†¿ š¾!¹wÖ®1‚2fU¨Ïì­q0‰òéÛþ˜ÜÙÔ"(0» ûÍXÓ¢ù:ºLÇc$Õœ=æjœø¶°ì‹†Înú¢¿š[TS†Ìà+P€aådžÒ-À>‚"È5aÓxÔ9ÿH~~@ NäF‘‹YS8i¿‹Áò÷Z Äל¼’µP©}r„ùþÞ}ùW°Ž{ƒ;µ]²14:sÉ?óRß©úÃñ5‡„ ûÊM™XÜÿs¡>–NNÂPU‰cIVý¦ë'üïÇ#m”+¦ãŸ«·ª!ξBÃ[ÅÈåìT­¨¹9<åj`¿CXÒ•ë¶yl<M˜&<«M,1Þ ÓC¥1Òö…†«5û®âK4n)7›^á\¿N†,ÜÖÎ-¿ü¾¨Ìè£öÍ…Ð=c'rlfÝÜõw§Y_2ìk±ÏnÚƒSñelÝW[¹W¼Ô§å’¦¾g‰ú2Y`3Z·X)u׎´ùìØ'l@È2¬ð=ð%iÁ -â(à¡ Õ!vöj8õå!Ä~}f £2y`‰ž¶ÜÝŠ­-ì\l»Jdаݘ,€sˆL¡Dí³7› è8Ú,êS›ˆ›hòŠ_‹gù„y¯7F)^B›DBJí…L0%U{ShðkÅ]QϬ9áxl1Y^4BYÈWεP¥$_ö0X#‰™#›? !~¡KÌÌ%”–ŸÕ§…£â¤#ê }—=[ÿõe,U½)ìToEz¯r¯$ÿdœìŽõ#¸ûº>@{âP­Ï€uß6¹å Ÿw¹2ª>À=U‚½˜xu˜ÈXWWó ¯RÅ#Sus¸ê¦ýD¦p2Ä|é µß©{¦;C¢_¦ñ¬‹WÜ»Ð4—9ø춮²ù„¤n‰€TÖ͢ǵ—^ ¢,Æ­ëz‰, z‰úÝ^CH½¥ý:m«8zû Ξs›´¼m‚DÚ›°¼Ç^ŒÒŠsÌÎNÃÌÄžÒp¾"aÔ½}]9–Ïn#,çZ·mN¸K¨W]Ðʲ|YÊgI¶­äy`…I{Ó4²\sÂw7œh"ÈÃð3¤IYN›ÊÓžQôúщ® Ì„7Ú$m^Oì…Üi”Æ7Sx;O«ŽÅmg¨ráEýï:ßøØi÷Èû'>¦òI7å꽟Oux,zI)§R42nYÖOò×ìö©˜^ Ï?bÁÅ-®Óš¡îŒ/k©–¼ŸkßîÐÑ8]Ð^DF‡ý‘“¥endË’½c•8&öPš£W©½f›É ……Gné+ßwpXäŒ{µ|qå§5sÆ=ÐúÉ r6ýOÓ`;Åöç9Ý.£6’ÊþôØõ/q:—¤¨Ö ÷o«¢ìŠ[ªÁÌ_sœƒÞð'(„ͨÞ7¨¨ýÏËÈLûwT*‹ZÈ<ówZnöO¼yŸí•ëåÃÍmزQ#ïֻňª1¸ðšO×UDŽ,"+t6HÃz³N{ßKÅ$Ä …¾'ΡlbWCì5Ï‘)7v¾â󿶣Ëc )™ô¨æf Wt)²ã,ž"w˜è¾%ïñ*6©ªßZ„ô­8e(hJëfëN“¤ÿdvn;M1rÆìÂÁØ­œrk€Ð´Ç÷¡¬óÑ)ë’°^ßAd¿Ÿ ¼zê7„ÏZð?·Lyê ,ŽãËwsn³e•Ò34£xºrÐ-±“sf¯ôÌ - -rÌ Tò¹mÎÍf¤Y:Y[È®±!Ì>t×î¿ÅŽ$/…C‘øjÙ„ú‡«egHê”JIôœ½‡M8†iŒ‘ì’.¸ÍÝ »’n]íúRÞÂËŒ·~ƒ—oúµ©Y€]T.>­Ý’ê5å^…ãýɱ(–ùB~Ç( «,,ÈbJŠê tI<šúæ—;ŸŠ»Õ8$Þøuý¸®dJÅæò$c÷@Ð/žMìÁ6C/géf¨²ÅÜ:?0 ¾ôso -*&82þb°ÈFêcð½ÅPŽ™t ¿¾30˜WÙ$}í¨•2 -ãvií:Fß ³$[wBDg$0™Ã$: C¶ç W·Fæ"§™¶õl±ZcB×Ñ©ÅKzæh` ¯:1XOw{˜ëj–ƒÊ²´Lê|MõºèKƯ5~F°æþóàý§ûg(3Ë>T¾Òq+dêéAíÞâ°ÄóAŸ/ôÄCù¯0OE£ÄA8ÓÉ6›úų¨½Ðdò¸:kVò˜Ô§ÕÏ^%²î3H¶Ä/¿J­ã¹nÚò_ç/¾ÕWîI-ÀYYc P\îOjr4á}cY¬ÜÛö¢ÑJVße¢7NÙ~Qlf ä#ÁGæ§Ð\£¬T®wªÊ«pÑÜÜ4ªð]dWJ~ér<ʼnUœWÑÈÁËõƒsW®$d^ÉÏ$Ê qÎ m*à }­^‰ís`‚ µ¶þµÍ(”SF±úiŸŸkyÖ·µbe—¾zHú<Žþ43?\ësÖINƒ8ý`˜®Õx媾L~¤Èï{ûYâd`e´5ød1Î^·zÅX66eQ "ƒ~ÈBJéÅ—{qÚÜXº©gp°ªzß&Ò¬Ó¼šV_§)ë¹,GŸQbGtSÔ¦&,φŸø ©(â\TÏÞµmn^@}Èÿ˜-Trð_ ÒœÝ ‚$å‘õ©NØ|Å¡°ØÇ0W_îFè2T…üKéðÇÐ)ˆÁí‡a3Žš¯s‡{¯ˆ™Pì°QHªù<¬Ÿ0J´çÎcÌü à}!6dÜ°üžê ØLÂ/Qªév\µ¯Ð)ñn4Ç’þ è—¸`Œ›ú갨̞… - -cÕ)'¾GY!–8•RõI¹0›2Ï/>o7wê—˜iœwmpÙ[µkZº=uÙø¶³ÄµÞ¿ŸÛ ï ×ûpÖ–·žŽ†»->yÕ.æ„iÔÏßDÄÀx3°-ƒ¨”D`èŠ×Z>¤À2|mÓ­!é,Æ_PQH,ŠQ/:„RôìD»F¯DøêB¸éôm‹˜Î?Hj6µ¸G«±ÒM‡2†gà ǾI¹br™ÊÕÐÙî‚÷fù¹"ÀKƒÔmSüæi¸ëÌDñ•œ»†W^OsÜÉC†ÓÐË Ç_›ºO·ŽÚÕò¹ÓÚú7ÄŽ>x&H´ÚæôŒ!t¬f"yQNÔäeÿë¹FB*¨»íl™OX:¤.˜ÇLO?A}:ò¼¤Å]ª¡ž; v?1Ü㲦ïQ|¬ôY±]ÞÑÄP€-âvZn÷XpŸ´îBðµ?Vw†¢ü >gþê7å×ëÃŸÚ Úq¿ªCê Î7°GIÒ^êVšèù$ò’ ¨Òñăl}ÏiT‚8Õ)¥s¥r‚ÇÞˆ–Gˆ‚›¥2Û‰ó6û¸Ù–¼néÈß… hõ¶p -Ñ¿6Ý®cîsm>|–ÖŽ­ÜØL ]z‹™'R“é8Þªÿ& ²Mq»Ì†q„.[ÚW¬í'/WZ‹Ž×ªÐø½] Ë¤èÅ}ê²¼qÛ¡SâºaGKú'anð4Xb«8a_û†#0;c̈¡ê—âýjy&5IE‘BVµqh(Þ/ æ ¾rüü£µ-sµ^Ìbö¸ÞB–›;b½µ¤}AÜj2)IsîÞ Gi;6?è÷vhdQ`”§úµ^—>ruffLã±"ö« 5Ã%”„lë/t£ÅLÐÿÒ„ËéýÌ “¯¬ì^°b -:Ñú?Ķ¶; -endstream -endobj -722 0 obj << -/Type /FontDescriptor -/FontName /EEGFTS+NimbusRomNo9L-ReguItal -/Flags 4 -/FontBBox [-169 -270 1010 924] -/Ascent 668 -/CapHeight 668 -/Descent -193 -/ItalicAngle -15 -/StemV 78 -/XHeight 441 -/CharSet (/C/E/F/G/I/S/a/b/c/comma/d/e/eight/f/fi/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/r/s/t/three/two/u/v/w/x/y/z) -/FontFile 721 0 R ->> endobj -671 0 obj << -/Type /Encoding -/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 65/A/B/C/D/E/F/G/H/I/J 76/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y 91/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 149/bullet 169/copyright 174/registered] ->> endobj -317 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /YQJSDJ+CMEX10 -/FontDescriptor 690 0 R -/FirstChar 88 -/LastChar 88 -/Widths 676 0 R ->> endobj -313 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /CVGKQU+CMMI10 -/FontDescriptor 692 0 R -/FirstChar 62 -/LastChar 120 -/Widths 680 0 R ->> endobj -316 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EFXCJE+CMMI7 -/FontDescriptor 694 0 R -/FirstChar 59 -/LastChar 107 -/Widths 677 0 R ->> endobj -315 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JVDJDJ+CMR10 -/FontDescriptor 696 0 R -/FirstChar 43 -/LastChar 61 -/Widths 678 0 R ->> endobj -314 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /XLWYJF+CMR7 -/FontDescriptor 698 0 R -/FirstChar 49 -/LastChar 61 -/Widths 679 0 R ->> endobj -318 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EMXNQD+CMSY10 -/FontDescriptor 700 0 R -/FirstChar 1 -/LastChar 106 -/Widths 675 0 R ->> endobj -499 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /DJYPXZ+CMSY6 -/FontDescriptor 702 0 R -/FirstChar 94 -/LastChar 94 -/Widths 673 0 R ->> endobj -312 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /LAJUWJ+CMSY7 -/FontDescriptor 704 0 R -/FirstChar 94 -/LastChar 94 -/Widths 681 0 R ->> endobj -239 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /YDPBQZ+NimbusMonL-Regu -/FontDescriptor 706 0 R -/FirstChar 34 -/LastChar 121 -/Widths 684 0 R -/Encoding 671 0 R ->> endobj -227 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IPRZVI+NimbusSanL-Bold -/FontDescriptor 708 0 R -/FirstChar 40 -/LastChar 174 -/Widths 688 0 R -/Encoding 671 0 R ->> endobj -309 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /CIYFZS+NimbusSanL-BoldCond -/FontDescriptor 710 0 R -/FirstChar 40 -/LastChar 121 -/Widths 682 0 R -/Encoding 671 0 R ->> endobj -228 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /NYWZOF+NimbusSanL-BoldItal -/FontDescriptor 712 0 R -/FirstChar 44 -/LastChar 114 -/Widths 687 0 R -/Encoding 671 0 R ->> endobj -529 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /KFEQLI+NimbusSanL-BoldCondItal -/FontDescriptor 714 0 R -/FirstChar 44 -/LastChar 119 -/Widths 672 0 R -/Encoding 671 0 R ->> endobj -306 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IXMTHF+NimbusSanL-Regu -/FontDescriptor 716 0 R -/FirstChar 49 -/LastChar 89 -/Widths 683 0 R -/Encoding 671 0 R ->> endobj -237 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /ZDVWXI+NimbusRomNo9L-Medi -/FontDescriptor 718 0 R -/FirstChar 46 -/LastChar 121 -/Widths 686 0 R -/Encoding 671 0 R ->> endobj -238 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IPABSO+NimbusRomNo9L-Regu -/FontDescriptor 720 0 R -/FirstChar 2 -/LastChar 174 -/Widths 685 0 R -/Encoding 671 0 R ->> endobj -498 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EEGFTS+NimbusRomNo9L-ReguItal -/FontDescriptor 722 0 R -/FirstChar 2 -/LastChar 122 -/Widths 674 0 R -/Encoding 671 0 R ->> endobj -229 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [222 0 R 235 0 R 274 0 R 298 0 R 303 0 R 323 0 R] ->> endobj -364 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [358 0 R 366 0 R 432 0 R 460 0 R 475 0 R 494 0 R] ->> endobj -519 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [516 0 R 526 0 R 538 0 R 545 0 R 553 0 R 559 0 R] ->> endobj -572 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [567 0 R 576 0 R 582 0 R 590 0 R 598 0 R 604 0 R] ->> endobj -616 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [611 0 R 618 0 R 626 0 R 633 0 R 641 0 R 651 0 R] ->> endobj -663 0 obj << -/Type /Pages -/Count 2 -/Parent 723 0 R -/Kids [658 0 R 666 0 R] ->> endobj -723 0 obj << -/Type /Pages -/Count 32 -/Kids [229 0 R 364 0 R 519 0 R 572 0 R 616 0 R 663 0 R] ->> endobj -724 0 obj << -/Type /Outlines -/First 7 0 R -/Last 51 0 R -/Count 5 ->> endobj -219 0 obj << -/Title 220 0 R -/A 217 0 R -/Parent 215 0 R ->> endobj -215 0 obj << -/Title 216 0 R -/A 213 0 R -/Parent 51 0 R -/Prev 183 0 R -/First 219 0 R -/Last 219 0 R -/Count -1 ->> endobj -211 0 obj << -/Title 212 0 R -/A 209 0 R -/Parent 191 0 R -/Prev 207 0 R ->> endobj -207 0 obj << -/Title 208 0 R -/A 205 0 R -/Parent 191 0 R -/Prev 203 0 R -/Next 211 0 R ->> endobj -203 0 obj << -/Title 204 0 R -/A 201 0 R -/Parent 191 0 R -/Prev 199 0 R -/Next 207 0 R ->> endobj -199 0 obj << -/Title 200 0 R -/A 197 0 R -/Parent 191 0 R -/Prev 195 0 R -/Next 203 0 R ->> endobj -195 0 obj << -/Title 196 0 R -/A 193 0 R -/Parent 191 0 R -/Next 199 0 R ->> endobj -191 0 obj << -/Title 192 0 R -/A 189 0 R -/Parent 183 0 R -/Prev 187 0 R -/First 195 0 R -/Last 211 0 R -/Count -5 ->> endobj -187 0 obj << -/Title 188 0 R -/A 185 0 R -/Parent 183 0 R -/Next 191 0 R ->> endobj -183 0 obj << -/Title 184 0 R -/A 181 0 R -/Parent 51 0 R -/Prev 55 0 R -/Next 215 0 R -/First 187 0 R -/Last 191 0 R -/Count -2 ->> endobj -179 0 obj << -/Title 180 0 R -/A 177 0 R -/Parent 63 0 R -/Prev 175 0 R ->> endobj -175 0 obj << -/Title 176 0 R -/A 173 0 R -/Parent 63 0 R -/Prev 171 0 R -/Next 179 0 R ->> endobj -171 0 obj << -/Title 172 0 R -/A 169 0 R -/Parent 63 0 R -/Prev 167 0 R -/Next 175 0 R ->> endobj -167 0 obj << -/Title 168 0 R -/A 165 0 R -/Parent 63 0 R -/Prev 163 0 R -/Next 171 0 R ->> endobj -163 0 obj << -/Title 164 0 R -/A 161 0 R -/Parent 63 0 R -/Prev 159 0 R -/Next 167 0 R ->> endobj -159 0 obj << -/Title 160 0 R -/A 157 0 R -/Parent 63 0 R -/Prev 155 0 R -/Next 163 0 R ->> endobj -155 0 obj << -/Title 156 0 R -/A 153 0 R -/Parent 63 0 R -/Prev 151 0 R -/Next 159 0 R ->> endobj -151 0 obj << -/Title 152 0 R -/A 149 0 R -/Parent 63 0 R -/Prev 147 0 R -/Next 155 0 R ->> endobj -147 0 obj << -/Title 148 0 R -/A 145 0 R -/Parent 63 0 R -/Prev 143 0 R -/Next 151 0 R ->> endobj -143 0 obj << -/Title 144 0 R -/A 141 0 R -/Parent 63 0 R -/Prev 139 0 R -/Next 147 0 R ->> endobj -139 0 obj << -/Title 140 0 R -/A 137 0 R -/Parent 63 0 R -/Prev 135 0 R -/Next 143 0 R ->> endobj -135 0 obj << -/Title 136 0 R -/A 133 0 R -/Parent 63 0 R -/Prev 131 0 R -/Next 139 0 R ->> endobj -131 0 obj << -/Title 132 0 R -/A 129 0 R -/Parent 63 0 R -/Prev 127 0 R -/Next 135 0 R ->> endobj -127 0 obj << -/Title 128 0 R -/A 125 0 R -/Parent 63 0 R -/Prev 123 0 R -/Next 131 0 R ->> endobj -123 0 obj << -/Title 124 0 R -/A 121 0 R -/Parent 63 0 R -/Prev 119 0 R -/Next 127 0 R ->> endobj -119 0 obj << -/Title 120 0 R -/A 117 0 R -/Parent 63 0 R -/Prev 115 0 R -/Next 123 0 R ->> endobj -115 0 obj << -/Title 116 0 R -/A 113 0 R -/Parent 63 0 R -/Prev 111 0 R -/Next 119 0 R ->> endobj -111 0 obj << -/Title 112 0 R -/A 109 0 R -/Parent 63 0 R -/Prev 107 0 R -/Next 115 0 R ->> endobj -107 0 obj << -/Title 108 0 R -/A 105 0 R -/Parent 63 0 R -/Prev 103 0 R -/Next 111 0 R ->> endobj -103 0 obj << -/Title 104 0 R -/A 101 0 R -/Parent 63 0 R -/Prev 99 0 R -/Next 107 0 R ->> endobj -99 0 obj << -/Title 100 0 R -/A 97 0 R -/Parent 63 0 R -/Prev 95 0 R -/Next 103 0 R ->> endobj -95 0 obj << -/Title 96 0 R -/A 93 0 R -/Parent 63 0 R -/Prev 91 0 R -/Next 99 0 R ->> endobj -91 0 obj << -/Title 92 0 R -/A 89 0 R -/Parent 63 0 R -/Prev 87 0 R -/Next 95 0 R ->> endobj -87 0 obj << -/Title 88 0 R -/A 85 0 R -/Parent 63 0 R -/Prev 83 0 R -/Next 91 0 R ->> endobj -83 0 obj << -/Title 84 0 R -/A 81 0 R -/Parent 63 0 R -/Prev 79 0 R -/Next 87 0 R ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 63 0 R -/Prev 75 0 R -/Next 83 0 R ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 63 0 R -/Prev 71 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 63 0 R -/Prev 67 0 R -/Next 75 0 R ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 63 0 R -/Next 71 0 R ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 55 0 R -/Prev 59 0 R -/First 67 0 R -/Last 179 0 R -/Count -29 ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 55 0 R -/Next 63 0 R ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 51 0 R -/Next 183 0 R -/First 59 0 R -/Last 63 0 R -/Count -2 ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 724 0 R -/Prev 43 0 R -/First 55 0 R -/Last 215 0 R -/Count -3 ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 43 0 R ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 724 0 R -/Prev 39 0 R -/Next 51 0 R -/First 47 0 R -/Last 47 0 R -/Count -1 ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 724 0 R -/Prev 27 0 R -/Next 43 0 R ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 27 0 R -/Prev 31 0 R ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 27 0 R -/Next 35 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 724 0 R -/Prev 7 0 R -/Next 39 0 R -/First 31 0 R -/Last 35 0 R -/Count -2 ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 7 0 R -/Prev 19 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 7 0 R -/Prev 15 0 R -/Next 23 0 R ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 7 0 R -/Prev 11 0 R -/Next 19 0 R ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 7 0 R -/Next 15 0 R ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 724 0 R -/Next 27 0 R -/First 11 0 R -/Last 23 0 R -/Count -4 ->> endobj -725 0 obj << -/Names [(Doc-Start) 226 0 R (chapter.1) 6 0 R (chapter.2) 26 0 R (chapter.3) 38 0 R (chapter.4) 42 0 R (chapter.5) 50 0 R] -/Limits [(Doc-Start) (chapter.5)] ->> endobj -726 0 obj << -/Names [(erasure__code_8h) 478 0 R (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) 379 0 R (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) 380 0 R (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) 386 0 R (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) 374 0 R (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) 388 0 R] -/Limits [(erasure__code_8h) (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2)] ->> endobj -727 0 obj << -/Names [(erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) 372 0 R (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) 382 0 R (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) 381 0 R (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) 393 0 R (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) 376 0 R (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) 394 0 R] -/Limits [(erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6)] ->> endobj -728 0 obj << -/Names [(erasure__code_8h_a484460566a8c888fda3d769324461345) 521 0 R (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) 373 0 R (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) 320 0 R (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) 387 0 R (erasure__code_8h_a81be18ea979e8a32f384e1a7856badcf) 531 0 R (erasure__code_8h_aa486278c409735df8001096ac2b487dd) 384 0 R] -/Limits [(erasure__code_8h_a484460566a8c888fda3d769324461345) (erasure__code_8h_aa486278c409735df8001096ac2b487dd)] ->> endobj -729 0 obj << -/Names [(erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) 389 0 R (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) 375 0 R (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) 392 0 R (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) 396 0 R (erasure__code_8h_ac73ea8358bc3155c7f3a6c078a7d6d35) 520 0 R (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) 390 0 R] -/Limits [(erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610)] ->> endobj -730 0 obj << -/Names [(erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) 533 0 R (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) 377 0 R (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) 378 0 R (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) 395 0 R (erasure__code_8h_afd549f435ee28276b5a9408a3a6256b1) 532 0 R (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) 391 0 R] -/Limits [(erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11)] ->> endobj -731 0 obj << -/Names [(gf__vect__mul_8h) 479 0 R (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) 369 0 R (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) 371 0 R (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) 370 0 R (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) 385 0 R (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) 383 0 R] -/Limits [(gf__vect__mul_8h) (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1)] ->> endobj -732 0 obj << -/Names [(index) 307 0 R (index_about_sec) 308 0 R (index_ec_sec) 311 0 R (index_intro_sec) 310 0 R (index_sys_reg_sec) 319 0 R (page.1) 305 0 R] -/Limits [(index) (page.1)] ->> endobj -733 0 obj << -/Names [(page.10) 528 0 R (page.11) 540 0 R (page.12) 547 0 R (page.13) 555 0 R (page.14) 561 0 R (page.15) 569 0 R] -/Limits [(page.10) (page.15)] ->> endobj -734 0 obj << -/Names [(page.16) 578 0 R (page.17) 584 0 R (page.18) 592 0 R (page.19) 600 0 R (page.2) 325 0 R (page.20) 606 0 R] -/Limits [(page.16) (page.20)] ->> endobj -735 0 obj << -/Names [(page.21) 613 0 R (page.22) 620 0 R (page.23) 628 0 R (page.24) 635 0 R (page.25) 643 0 R (page.26) 653 0 R] -/Limits [(page.21) (page.26)] ->> endobj -736 0 obj << -/Names [(page.27) 660 0 R (page.28) 668 0 R (page.3) 360 0 R (page.4) 368 0 R (page.5) 434 0 R (page.6) 462 0 R] -/Limits [(page.27) (page.6)] ->> endobj -737 0 obj << -/Names [(page.7) 477 0 R (page.8) 496 0 R (page.9) 518 0 R (requires) 327 0 R (requires__requires000001) 435 0 R (requires__requires000002) 465 0 R] -/Limits [(page.7) (requires__requires000002)] ->> endobj -738 0 obj << -/Names [(requires__requires000003) 463 0 R (requires__requires000004) 464 0 R (requires__requires000005) 438 0 R (requires__requires000006) 436 0 R (requires__requires000007) 437 0 R (requires__requires000008) 441 0 R] -/Limits [(requires__requires000003) (requires__requires000008)] ->> endobj -739 0 obj << -/Names [(requires__requires000009) 439 0 R (requires__requires000010) 440 0 R (requires__requires000011) 444 0 R (requires__requires000012) 442 0 R (requires__requires000013) 443 0 R (requires__requires000014) 447 0 R] -/Limits [(requires__requires000009) (requires__requires000014)] ->> endobj -740 0 obj << -/Names [(requires__requires000015) 445 0 R (requires__requires000016) 446 0 R (requires__requires000017) 450 0 R (requires__requires000018) 448 0 R (requires__requires000019) 449 0 R (requires__requires000020) 467 0 R] -/Limits [(requires__requires000015) (requires__requires000020)] ->> endobj -741 0 obj << -/Names [(requires__requires000021) 466 0 R (section*.1) 497 0 R (section*.2) 654 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R] -/Limits [(requires__requires000021) (section.1.3)] ->> endobj -742 0 obj << -/Names [(section.1.4) 22 0 R (section.2.1) 30 0 R (section.2.2) 34 0 R (section.4.1) 46 0 R (section.5.1) 54 0 R (section.5.2) 182 0 R] -/Limits [(section.1.4) (section.5.2)] ->> endobj -743 0 obj << -/Names [(section.5.3) 214 0 R (subsection.5.1.1) 58 0 R (subsection.5.1.2) 62 0 R (subsection.5.2.1) 186 0 R (subsection.5.2.2) 190 0 R (subsection.5.3.1) 218 0 R] -/Limits [(section.5.3) (subsection.5.3.1)] ->> endobj -744 0 obj << -/Names [(subsubsection.5.1.2.1) 66 0 R (subsubsection.5.1.2.10) 102 0 R (subsubsection.5.1.2.11) 106 0 R (subsubsection.5.1.2.12) 110 0 R (subsubsection.5.1.2.13) 114 0 R (subsubsection.5.1.2.14) 118 0 R] -/Limits [(subsubsection.5.1.2.1) (subsubsection.5.1.2.14)] ->> endobj -745 0 obj << -/Names [(subsubsection.5.1.2.15) 122 0 R (subsubsection.5.1.2.16) 126 0 R (subsubsection.5.1.2.17) 130 0 R (subsubsection.5.1.2.18) 134 0 R (subsubsection.5.1.2.19) 138 0 R (subsubsection.5.1.2.2) 70 0 R] -/Limits [(subsubsection.5.1.2.15) (subsubsection.5.1.2.2)] ->> endobj -746 0 obj << -/Names [(subsubsection.5.1.2.20) 142 0 R (subsubsection.5.1.2.21) 146 0 R (subsubsection.5.1.2.22) 150 0 R (subsubsection.5.1.2.23) 154 0 R (subsubsection.5.1.2.24) 158 0 R (subsubsection.5.1.2.25) 162 0 R] -/Limits [(subsubsection.5.1.2.20) (subsubsection.5.1.2.25)] ->> endobj -747 0 obj << -/Names [(subsubsection.5.1.2.26) 166 0 R (subsubsection.5.1.2.27) 170 0 R (subsubsection.5.1.2.28) 174 0 R (subsubsection.5.1.2.29) 178 0 R (subsubsection.5.1.2.3) 74 0 R (subsubsection.5.1.2.4) 78 0 R] -/Limits [(subsubsection.5.1.2.26) (subsubsection.5.1.2.4)] ->> endobj -748 0 obj << -/Names [(subsubsection.5.1.2.5) 82 0 R (subsubsection.5.1.2.6) 86 0 R (subsubsection.5.1.2.7) 90 0 R (subsubsection.5.1.2.8) 94 0 R (subsubsection.5.1.2.9) 98 0 R (subsubsection.5.2.2.1) 194 0 R] -/Limits [(subsubsection.5.1.2.5) (subsubsection.5.2.2.1)] ->> endobj -749 0 obj << -/Names [(subsubsection.5.2.2.2) 198 0 R (subsubsection.5.2.2.3) 202 0 R (subsubsection.5.2.2.4) 206 0 R (subsubsection.5.2.2.5) 210 0 R (table.5.1) 530 0 R (table.5.10) 571 0 R] -/Limits [(subsubsection.5.2.2.2) (table.5.10)] ->> endobj -750 0 obj << -/Names [(table.5.11) 579 0 R (table.5.12) 585 0 R (table.5.13) 586 0 R (table.5.14) 593 0 R (table.5.15) 594 0 R (table.5.16) 601 0 R] -/Limits [(table.5.11) (table.5.16)] ->> endobj -751 0 obj << -/Names [(table.5.17) 607 0 R (table.5.18) 608 0 R (table.5.19) 614 0 R (table.5.2) 541 0 R (table.5.20) 615 0 R (table.5.21) 621 0 R] -/Limits [(table.5.17) (table.5.21)] ->> endobj -752 0 obj << -/Names [(table.5.22) 622 0 R (table.5.23) 623 0 R (table.5.24) 629 0 R (table.5.25) 630 0 R (table.5.26) 636 0 R (table.5.27) 637 0 R] -/Limits [(table.5.22) (table.5.27)] ->> endobj -753 0 obj << -/Names [(table.5.28) 644 0 R (table.5.29) 645 0 R (table.5.3) 542 0 R (table.5.30) 655 0 R (table.5.31) 661 0 R (table.5.32) 662 0 R] -/Limits [(table.5.28) (table.5.32)] ->> endobj -754 0 obj << -/Names [(table.5.33) 669 0 R (table.5.34) 670 0 R (table.5.4) 548 0 R (table.5.5) 549 0 R (table.5.6) 556 0 R (table.5.7) 562 0 R] -/Limits [(table.5.33) (table.5.7)] ->> endobj -755 0 obj << -/Names [(table.5.8) 563 0 R (table.5.9) 570 0 R (types_8h) 480 0 R (version) 361 0 R (version_test) 362 0 R (version_test2) 363 0 R] -/Limits [(table.5.8) (version_test2)] ->> endobj -756 0 obj << -/Kids [725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R] -/Limits [(Doc-Start) (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11)] ->> endobj -757 0 obj << -/Kids [731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R] -/Limits [(gf__vect__mul_8h) (page.6)] ->> endobj -758 0 obj << -/Kids [737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R] -/Limits [(page.7) (section.5.2)] ->> endobj -759 0 obj << -/Kids [743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R] -/Limits [(section.5.3) (subsubsection.5.2.2.1)] ->> endobj -760 0 obj << -/Kids [749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R] -/Limits [(subsubsection.5.2.2.2) (table.5.7)] ->> endobj -761 0 obj << -/Kids [755 0 R] -/Limits [(table.5.8) (version_test2)] ->> endobj -762 0 obj << -/Kids [756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R] -/Limits [(Doc-Start) (version_test2)] ->> endobj -763 0 obj << -/Dests 762 0 R ->> endobj -764 0 obj << -/Type /Catalog -/Pages 723 0 R -/Outlines 724 0 R -/Names 763 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /D >> 2 << /S /r >> 4 << /S /D >> ] >> -/OpenAction 221 0 R ->> endobj -765 0 obj << -/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20140408225608-07'00') -/ModDate (D:20140408225608-07'00') -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) ->> endobj -xref -0 766 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000397 00000 f -0000000015 00000 n -0000029129 00000 n -0000248311 00000 n -0000000060 00000 n -0000000164 00000 n -0000029306 00000 n -0000248239 00000 n -0000000211 00000 n -0000000339 00000 n -0000029424 00000 n -0000248153 00000 n -0000000387 00000 n -0000000454 00000 n -0000029541 00000 n -0000248067 00000 n -0000000502 00000 n -0000000645 00000 n -0000031891 00000 n -0000247994 00000 n -0000000693 00000 n -0000000818 00000 n -0000032878 00000 n -0000247870 00000 n -0000000864 00000 n -0000001017 00000 n -0000033056 00000 n -0000247796 00000 n -0000001065 00000 n -0000001218 00000 n -0000033174 00000 n -0000247722 00000 n -0000001266 00000 n -0000001457 00000 n -0000045007 00000 n -0000247634 00000 n -0000001503 00000 n -0000001676 00000 n -0000050083 00000 n -0000247509 00000 n -0000001722 00000 n -0000001802 00000 n -0000050139 00000 n -0000247448 00000 n -0000001850 00000 n -0000001925 00000 n -0000054175 00000 n -0000247335 00000 n -0000001971 00000 n -0000002091 00000 n -0000054292 00000 n -0000247223 00000 n -0000002139 00000 n -0000002320 00000 n -0000062532 00000 n -0000247149 00000 n -0000002373 00000 n -0000002503 00000 n -0000062588 00000 n -0000247036 00000 n -0000002556 00000 n -0000002696 00000 n -0000062701 00000 n -0000246962 00000 n -0000002754 00000 n -0000002857 00000 n -0000065938 00000 n -0000246875 00000 n -0000002915 00000 n -0000003046 00000 n -0000066108 00000 n -0000246788 00000 n -0000003104 00000 n -0000003230 00000 n -0000069083 00000 n -0000246701 00000 n -0000003288 00000 n -0000003391 00000 n -0000069252 00000 n -0000246614 00000 n -0000003449 00000 n -0000003593 00000 n -0000071916 00000 n -0000246527 00000 n -0000003651 00000 n -0000003800 00000 n -0000072086 00000 n -0000246440 00000 n -0000003858 00000 n -0000004002 00000 n -0000074788 00000 n -0000246353 00000 n -0000004060 00000 n -0000004204 00000 n -0000074958 00000 n -0000246264 00000 n -0000004262 00000 n -0000004412 00000 n -0000077736 00000 n -0000246173 00000 n -0000004472 00000 n -0000004617 00000 n -0000080387 00000 n -0000246081 00000 n -0000004677 00000 n -0000004822 00000 n -0000080558 00000 n -0000245989 00000 n -0000004882 00000 n -0000005032 00000 n -0000083234 00000 n -0000245897 00000 n -0000005092 00000 n -0000005237 00000 n -0000083405 00000 n -0000245805 00000 n -0000005297 00000 n -0000005442 00000 n -0000086187 00000 n -0000245713 00000 n -0000005502 00000 n -0000005652 00000 n -0000089050 00000 n -0000245621 00000 n -0000005712 00000 n -0000005857 00000 n -0000089221 00000 n -0000245529 00000 n -0000005917 00000 n -0000006062 00000 n -0000091925 00000 n -0000245437 00000 n -0000006122 00000 n -0000006272 00000 n -0000092096 00000 n -0000245345 00000 n -0000006332 00000 n -0000006477 00000 n -0000095033 00000 n -0000245253 00000 n -0000006537 00000 n -0000006679 00000 n -0000095203 00000 n -0000245161 00000 n -0000006739 00000 n -0000006856 00000 n -0000097392 00000 n -0000245069 00000 n -0000006916 00000 n -0000006977 00000 n -0000097563 00000 n -0000244977 00000 n -0000007037 00000 n -0000007151 00000 n -0000097734 00000 n -0000244885 00000 n -0000007211 00000 n -0000007272 00000 n -0000100342 00000 n -0000244793 00000 n -0000007332 00000 n -0000007449 00000 n -0000100513 00000 n -0000244701 00000 n -0000007509 00000 n -0000007649 00000 n -0000103118 00000 n -0000244609 00000 n -0000007709 00000 n -0000007854 00000 n -0000103289 00000 n -0000244517 00000 n -0000007914 00000 n -0000008059 00000 n -0000106077 00000 n -0000244439 00000 n -0000008119 00000 n -0000008259 00000 n -0000106248 00000 n -0000244309 00000 n -0000008308 00000 n -0000008488 00000 n -0000109728 00000 n -0000244230 00000 n -0000008542 00000 n -0000008673 00000 n -0000109784 00000 n -0000244112 00000 n -0000008727 00000 n -0000008868 00000 n -0000109898 00000 n -0000244033 00000 n -0000008927 00000 n -0000009016 00000 n -0000110069 00000 n -0000243940 00000 n -0000009075 00000 n -0000009187 00000 n -0000112732 00000 n -0000243847 00000 n -0000009246 00000 n -0000009363 00000 n -0000112903 00000 n -0000243754 00000 n -0000009422 00000 n -0000009539 00000 n -0000115203 00000 n -0000243675 00000 n -0000009598 00000 n -0000009710 00000 n -0000115374 00000 n -0000243558 00000 n -0000009759 00000 n -0000009903 00000 n -0000115431 00000 n -0000243493 00000 n -0000009957 00000 n -0000010088 00000 n -0000010605 00000 n -0000010717 00000 n -0000012711 00000 n -0000010140 00000 n -0000012654 00000 n -0000241253 00000 n -0000241599 00000 n -0000242647 00000 n -0000012333 00000 n -0000012585 00000 n -0000012632 00000 n -0000014877 00000 n -0000015067 00000 n -0000014745 00000 n -0000012824 00000 n -0000242123 00000 n -0000242297 00000 n -0000241082 00000 n -0000016450 00000 n -0000016600 00000 n -0000016753 00000 n -0000016906 00000 n -0000017059 00000 n -0000017212 00000 n -0000017362 00000 n -0000017515 00000 n -0000017667 00000 n -0000017818 00000 n -0000017969 00000 n -0000018121 00000 n -0000018272 00000 n -0000018424 00000 n -0000018583 00000 n -0000018741 00000 n -0000018905 00000 n -0000019069 00000 n -0000019233 00000 n -0000019397 00000 n -0000019560 00000 n -0000019724 00000 n -0000019887 00000 n -0000020051 00000 n -0000020214 00000 n -0000020379 00000 n -0000020544 00000 n -0000020708 00000 n -0000020873 00000 n -0000021037 00000 n -0000021202 00000 n -0000021366 00000 n -0000022687 00000 n -0000021531 00000 n -0000016070 00000 n -0000015165 00000 n -0000022852 00000 n -0000023016 00000 n -0000023181 00000 n -0000023345 00000 n -0000023510 00000 n -0000023674 00000 n -0000023838 00000 n -0000024003 00000 n -0000024167 00000 n -0000024332 00000 n -0000024496 00000 n -0000024661 00000 n -0000024814 00000 n -0000024973 00000 n -0000025132 00000 n -0000025296 00000 n -0000025460 00000 n -0000025624 00000 n -0000025788 00000 n -0000025952 00000 n -0000026105 00000 n -0000026264 00000 n -0000022387 00000 n -0000021616 00000 n -0000028880 00000 n -0000031270 00000 n -0000029659 00000 n -0000028748 00000 n -0000026349 00000 n -0000029072 00000 n -0000241953 00000 n -0000029184 00000 n -0000029245 00000 n -0000241424 00000 n -0000029362 00000 n -0000029480 00000 n -0000240940 00000 n -0000240085 00000 n -0000240514 00000 n -0000240372 00000 n -0000240229 00000 n -0000239942 00000 n -0000240655 00000 n -0000029597 00000 n -0000062644 00000 n -0000031420 00000 n -0000031947 00000 n -0000031122 00000 n -0000029845 00000 n -0000031834 00000 n -0000031628 00000 n -0000045063 00000 n -0000035239 00000 n -0000035430 00000 n -0000035621 00000 n -0000035812 00000 n -0000036003 00000 n -0000036194 00000 n -0000036384 00000 n -0000036575 00000 n -0000036765 00000 n -0000036956 00000 n -0000037146 00000 n -0000037337 00000 n -0000037528 00000 n -0000037719 00000 n -0000037910 00000 n -0000038101 00000 n -0000038292 00000 n -0000038483 00000 n -0000038674 00000 n -0000038865 00000 n -0000039056 00000 n -0000039247 00000 n -0000039438 00000 n -0000039628 00000 n -0000039819 00000 n -0000040009 00000 n -0000040200 00000 n -0000040390 00000 n -0000040581 00000 n -0000033229 00000 n -0000032709 00000 n -0000032058 00000 n -0000032821 00000 n -0000032934 00000 n -0000032995 00000 n -0000033112 00000 n -0000242764 00000 n -0000040829 00000 n -0000034883 00000 n -0000033340 00000 n -0000040772 00000 n -0000115146 00000 n -0000112846 00000 n -0000110012 00000 n -0000106020 00000 n -0000100456 00000 n -0000072029 00000 n -0000077679 00000 n -0000080501 00000 n -0000080330 00000 n -0000083177 00000 n -0000088993 00000 n -0000092039 00000 n -0000069026 00000 n -0000066051 00000 n -0000109841 00000 n -0000062814 00000 n -0000112675 00000 n -0000103232 00000 n -0000100285 00000 n -0000103061 00000 n -0000069196 00000 n -0000074731 00000 n -0000083348 00000 n -0000089164 00000 n -0000071859 00000 n -0000074901 00000 n -0000086130 00000 n -0000091868 00000 n -0000000399 00000 f -0000041881 00000 n -0000000401 00000 f -0000042073 00000 n -0000000403 00000 f -0000042265 00000 n -0000000405 00000 f -0000042456 00000 n -0000000407 00000 f -0000042648 00000 n -0000000409 00000 f -0000042840 00000 n -0000000411 00000 f -0000043032 00000 n -0000000413 00000 f -0000043224 00000 n -0000000415 00000 f -0000043415 00000 n -0000000417 00000 f -0000043607 00000 n -0000000419 00000 f -0000043799 00000 n -0000000421 00000 f -0000043991 00000 n -0000000423 00000 f -0000044182 00000 n -0000000425 00000 f -0000044374 00000 n -0000000427 00000 f -0000044566 00000 n -0000000429 00000 f -0000044758 00000 n -0000000451 00000 f -0000046866 00000 n -0000046034 00000 n -0000041629 00000 n -0000040927 00000 n -0000044950 00000 n -0000045124 00000 n -0000045181 00000 n -0000045238 00000 n -0000045295 00000 n -0000045352 00000 n -0000045409 00000 n -0000045465 00000 n -0000045522 00000 n -0000045579 00000 n -0000045636 00000 n -0000045693 00000 n -0000045750 00000 n -0000045807 00000 n -0000045864 00000 n -0000045921 00000 n -0000045977 00000 n -0000000453 00000 f -0000047057 00000 n -0000000455 00000 f -0000047249 00000 n -0000000457 00000 f -0000047441 00000 n -0000000000 00000 f -0000047633 00000 n -0000048165 00000 n -0000046702 00000 n -0000046132 00000 n -0000047825 00000 n -0000047882 00000 n -0000047939 00000 n -0000047995 00000 n -0000048051 00000 n -0000048108 00000 n -0000049099 00000 n -0000049257 00000 n -0000049411 00000 n -0000049569 00000 n -0000049723 00000 n -0000049873 00000 n -0000050195 00000 n -0000048927 00000 n -0000048263 00000 n -0000050026 00000 n -0000054231 00000 n -0000106191 00000 n -0000115317 00000 n -0000052001 00000 n -0000052194 00000 n -0000052387 00000 n -0000052580 00000 n -0000052772 00000 n -0000052963 00000 n -0000053156 00000 n -0000053348 00000 n -0000053541 00000 n -0000053733 00000 n -0000053926 00000 n -0000055873 00000 n -0000054404 00000 n -0000051789 00000 n -0000050306 00000 n -0000054118 00000 n -0000054348 00000 n -0000242470 00000 n -0000240798 00000 n -0000056064 00000 n -0000056257 00000 n -0000056450 00000 n -0000056642 00000 n -0000056835 00000 n -0000057028 00000 n -0000057219 00000 n -0000057411 00000 n -0000057604 00000 n -0000057796 00000 n -0000057989 00000 n -0000058181 00000 n -0000058374 00000 n -0000058567 00000 n -0000061704 00000 n -0000058817 00000 n -0000055629 00000 n -0000054554 00000 n -0000058760 00000 n -0000242881 00000 n -0000097677 00000 n -0000097335 00000 n -0000061896 00000 n -0000062089 00000 n -0000062282 00000 n -0000062871 00000 n -0000061548 00000 n -0000058941 00000 n -0000062475 00000 n -0000241774 00000 n -0000062757 00000 n -0000095147 00000 n -0000094976 00000 n -0000097506 00000 n -0000065329 00000 n -0000065522 00000 n -0000065688 00000 n -0000066221 00000 n -0000065181 00000 n -0000063034 00000 n -0000065881 00000 n -0000065994 00000 n -0000066164 00000 n -0000068803 00000 n -0000069365 00000 n -0000068671 00000 n -0000066371 00000 n -0000068969 00000 n -0000069139 00000 n -0000069308 00000 n -0000071472 00000 n -0000071638 00000 n -0000072142 00000 n -0000071332 00000 n -0000069528 00000 n -0000071802 00000 n -0000071972 00000 n -0000074451 00000 n -0000075014 00000 n -0000074319 00000 n -0000072305 00000 n -0000074617 00000 n -0000074674 00000 n -0000074844 00000 n -0000077234 00000 n -0000077400 00000 n -0000077850 00000 n -0000077094 00000 n -0000075177 00000 n -0000077566 00000 n -0000077623 00000 n -0000077793 00000 n -0000242998 00000 n -0000079943 00000 n -0000080109 00000 n -0000080615 00000 n -0000079803 00000 n -0000078013 00000 n -0000080273 00000 n -0000080444 00000 n -0000082897 00000 n -0000083462 00000 n -0000082765 00000 n -0000080778 00000 n -0000083063 00000 n -0000083120 00000 n -0000083291 00000 n -0000085685 00000 n -0000085851 00000 n -0000086301 00000 n -0000085545 00000 n -0000083625 00000 n -0000086017 00000 n -0000086074 00000 n -0000086244 00000 n -0000088606 00000 n -0000088772 00000 n -0000089278 00000 n -0000088466 00000 n -0000086464 00000 n -0000088936 00000 n -0000089107 00000 n -0000091588 00000 n -0000092153 00000 n -0000091456 00000 n -0000089441 00000 n -0000091754 00000 n -0000091811 00000 n -0000091982 00000 n -0000094697 00000 n -0000095260 00000 n -0000094565 00000 n -0000092316 00000 n -0000094863 00000 n -0000094920 00000 n -0000095090 00000 n -0000243115 00000 n -0000097791 00000 n -0000097109 00000 n -0000095423 00000 n -0000097221 00000 n -0000097278 00000 n -0000097449 00000 n -0000097620 00000 n -0000100006 00000 n -0000100570 00000 n -0000099874 00000 n -0000097954 00000 n -0000100171 00000 n -0000100228 00000 n -0000100399 00000 n -0000102781 00000 n -0000103346 00000 n -0000102649 00000 n -0000100733 00000 n -0000102947 00000 n -0000103004 00000 n -0000103175 00000 n -0000105740 00000 n -0000108653 00000 n -0000106301 00000 n -0000105608 00000 n -0000103509 00000 n -0000105906 00000 n -0000105963 00000 n -0000106134 00000 n -0000108845 00000 n -0000109038 00000 n -0000109231 00000 n -0000109422 00000 n -0000110126 00000 n -0000108489 00000 n -0000106464 00000 n -0000109615 00000 n -0000109672 00000 n -0000109955 00000 n -0000112396 00000 n -0000112960 00000 n -0000112264 00000 n -0000110289 00000 n -0000112561 00000 n -0000112618 00000 n -0000112789 00000 n -0000243232 00000 n -0000114866 00000 n -0000115488 00000 n -0000114734 00000 n -0000113110 00000 n -0000115032 00000 n -0000115089 00000 n -0000115260 00000 n -0000239481 00000 n -0000115638 00000 n -0000115961 00000 n -0000115986 00000 n -0000116461 00000 n -0000117073 00000 n -0000117099 00000 n -0000117412 00000 n -0000117523 00000 n -0000117618 00000 n -0000117979 00000 n -0000118004 00000 n -0000118351 00000 n -0000118535 00000 n -0000118906 00000 n -0000119568 00000 n -0000119892 00000 n -0000120195 00000 n -0000120735 00000 n -0000122499 00000 n -0000122732 00000 n -0000125260 00000 n -0000125496 00000 n -0000127821 00000 n -0000128050 00000 n -0000129970 00000 n -0000130203 00000 n -0000132711 00000 n -0000132958 00000 n -0000134482 00000 n -0000134734 00000 n -0000135998 00000 n -0000136227 00000 n -0000137496 00000 n -0000137726 00000 n -0000151595 00000 n -0000151990 00000 n -0000160014 00000 n -0000160352 00000 n -0000171728 00000 n -0000172110 00000 n -0000178885 00000 n -0000179160 00000 n -0000186548 00000 n -0000186829 00000 n -0000192223 00000 n -0000192519 00000 n -0000206190 00000 n -0000206568 00000 n -0000225983 00000 n -0000226563 00000 n -0000239124 00000 n -0000243317 00000 n -0000243419 00000 n -0000248420 00000 n -0000248600 00000 n -0000249046 00000 n -0000249560 00000 n -0000250074 00000 n -0000250588 00000 n -0000251102 00000 n -0000251548 00000 n -0000251743 00000 n -0000251913 00000 n -0000252082 00000 n -0000252252 00000 n -0000252417 00000 n -0000252635 00000 n -0000252941 00000 n -0000253247 00000 n -0000253553 00000 n -0000253776 00000 n -0000253973 00000 n -0000254203 00000 n -0000254490 00000 n -0000254777 00000 n -0000255067 00000 n -0000255352 00000 n -0000255629 00000 n -0000255877 00000 n -0000256071 00000 n -0000256264 00000 n -0000256458 00000 n -0000256651 00000 n -0000256840 00000 n -0000257034 00000 n -0000257188 00000 n -0000257305 00000 n -0000257417 00000 n -0000257544 00000 n -0000257669 00000 n -0000257746 00000 n -0000257863 00000 n -0000257901 00000 n -0000258111 00000 n -trailer -<< /Size 766 -/Root 764 0 R -/Info 765 0 R -/ID [<07BF1BFF8396560A3D29CED1E32BB73D> <07BF1BFF8396560A3D29CED1E32BB73D>] >> -startxref -258442 -%%EOF diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.13.pdf b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/docs/isa-l_open_src_2.13.pdf deleted file mode 100644 index 7ae862f99f63a7930c99db5ea893828ab796bc28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270361 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

gQt1dY``oL*)s2_7Fk8nQtD1G=$9`j+Z zq$<0*D7YG`cWn4ZTkg$ZDc=9OD_*FS4+jony=cAGSXYc~Ry`k&pxOtvtP(BPW04Lx z)FMc+CLS`9bNnE2f6rw-+fq{42dE@Dy6k##NYsGadw41M zwn?6*+w`mzrk^#mTE=Y>9{4)rL=#ldWP`u7VXxL%f)ZEg**f_uGzV52!Zg$;jxlZj z977QQHhHUhZf3WOE4Rkh(;JF@>(yX=qP+j<&}DhD)gLA^t^d`MoU)l>c8&JjHcr;! zqc||g_+!zE#f?m6#c>#AyEP1}k;jxt`8d5(##%nasW@eExu9Gp;*^%%*Cy!w!d8mU zk7A3Pm%%Jr<~{8-u;dNu-L)2arm6g9z1+Zm0eqNzaF2VfibcJ%%HVz(#$5k7M)rF0!Q3BXqC@Eh*FF?E#Ge(dBCUCj z2>JxIB~kog%3kF%V~>J=>;P2aZ@i(Nf-;cPz=_uC`5q8am~9+tU|Iu zk#t1rwZ?>b6JJ-&L17eAZH~_Vy|>0Qxcach9GNZ7Zx=FBjs_)69pmEO4HOz8}Xz%U56%=T&1?8c)Or2;MY7+tz|HR}ol zCBF;xU#Xr1&(wCSY7ra>Pu8Cs7T#DrNa_$|?>hWTHFx?he(osg{z;reBua z(#WnR$41L&4J2O2r}@r=!k#%6**dex?ggC2VgEpZAOWA+Ht$kJ+%LIjBe}6vIe=Si z$J#6|v(MdDUn=bM3 zkRG_vQ848qw(l_twA3C<+$uha+Rd=}j(Ez6QU#!m13z;rueDF$7oMaXGwMa!-1 z_GX7RHa<wB<$ar9$8_*huC7JR# z*k4WKrsx$*j~tf$(TxY)0Ip5SyL85$@K>?EB#O~Cme)+JJ)S)hc!|$5(0A`ParJ15 z2OMlsKFNe%tgKumPxW2f$3uS$aafYa{z~Dgz7qw{D{9}e_X{oYz$NPh&xIhZw!Vd+ z?D*RQ!&I`hRLbIjW2o`;GX1TFk~$qoU|eN|dVCTpzQnbU7jTBR61q-40U*zI|H!}| z@|h}d5b)XM}flnf3s zV4Gl=E1C^&Suqj~0^hB)WO(c>PaGsxoZN~=bRN-Lr&nTc1>~iiFz1x=ZcRkp`*qh< zkIRD72MSk9=t*kp`57J$_VM#~He?-!aTAMK^;*0fv1ac@i$S=Jq3{v4wVkv8tK~Nh z@oILevcd_I(34ExF~Lq9X1iXE$9rPlt0lO_*E6IvZO?wG#8qRlF7%XP9D;yGjxX!+ zeoJU`Of%3|R3fB_`rAKI`PI#{dFe^Q#9fTWcNxLQg-w@8v9_UtmPJ&yFieJtwlxeE zgRIgdi+_rw8JPi~s){RS0pKDL986f$$6}kfTz`JSm}N<&72k&xrPCxNolHJl9!y+2 z8$LD&y}Q=5uMwLTWUEKM%L#j4kG%d0^l@@-OW<{xB0xx`@`Jg7V5gbCYF{bakK4Zx z8qjQ9^Lx+gJik2P{pl{(_r4|Ch$iDTX)2uVn5*D9mR3$napAIg?S~$ zHS|{^0^Df9eXAGT+YBh%+UH%eT!XTpNQZ^|-HPgbd@vKT2ObSScR2#k=;Q2J-ZFm4 z_CAx0I}wS05#vg-{F2|zb7Q*Dho5IGHD3zX-R?gO^HaMRCEjOH!$b+DTG?_Rd%<6>55rF zH}G@@x(DIgIm^U9|0@Oc_r@XE$j|z+3h6~w-+*&^$~!~jxbVn)s@+&Kh=dcA&TE8F zWl#d2B!qA875R@4Enua(qay_TCO*pIN835(c#{m%grFIBo9_8Az4q?Rt%R!U%8W`E+oN7vq{+~n$i^z`I>V-x05qKV{E!(vXWWcr% zTYon|<*3EHNF=8Q%NKe?Os?%}{dddZ{KD1N!r+!|91mu$^=Wn4e-**DN)fW`x8j&3 zl^dOaH7YkK*hwYyT6Aw=pGRgGQSV61BxGMEaS4i05Zmf;7 zbxV;sE{k%1E>Q}`Rb63@*^5pzK)ze7*BRxHH){FQe_Ru_<)a~VsgX7&X-?g@vkQrl zTy>6@QYCSwu}U?1bWXiwSu1*-@zPL`!I})234rsFQja>1ngk2T$bH$KWKvkgN&l?{ zU9R&LUz<51a}p@S*7f^Z52d}zc(2za<&?UmaFeDx;W^$Ew!~6!SB?Y!DuwLkw?(|W zaeTxYi&?R<1z!6`jkTWefe1>jsP~9_lDHSQldEGpm}7tX1Lm~ffuGy%RO+hv?qr~C z&`aoe;f03y`aY1xcF21_r+W!5hF$<2@e%U-@p~$k+GIG4*-QYo5wwS#w6rza$Cb5{-+}E^gCjlMjD1 z-p8$z5Msv?N)e(|b}r$5SQ?1b0{jkDsjA^6PEy;h>8#7fIO4_; zu$FPf>viWnEJN+qdYCW4F9kf5HCc6GN-5aw|yS4a++F`PF1LsAnlHT^GjOs@O|A|t0|z_i3{h=fwMBOhTg zv)Fx~&a$o~BD#_3YV+TTJ!_b>13hsbUx(-U30B@(9rtmTxS*A&N?WU){9pa-;|C=Z zNB2={L5~-i3W`mvVirpy!fh)D!*xrpA)DjL4FNdQ^V5^31&cPf(;X`o!OwR45oET2 zVVv#*WO6vSxSyjO6=nuR!ZhQL!;-O`9`<1zBi(Wd@}$Xl;k{U*X^1e7Rx3xa~q zffuLM!FvAUs9z@0#-e6EQw;hm2G#9`sx{eNqQSLn_HwleIoNmV<`MeVr-R^La!ee& zeSD5-s+_!tO%8$x(H9>SmtsB#}wz=F7 zhfbtjT>a4`E*B88H|uv@h-LUf8)Abk!STM*d!c0)#d#5*8{*0A^=#c6B3hQrFRE6n zlW^i{aNG+LWNx~hHZP~(&(-ErjP|81VD~~-Bilnt54VJIeRzxx@-NjS7xoTr$r_vL z2ybbZwAh(bcFdr8booX#vNYjC5)~p@xIE)t6jMF>6h!J{!vHZ*I9$AqpzyKx;l5G8 zH44**|K4&w+F>>ak+%t=#e;7ea%k&boR+lB%^^-?9eVg;mvkLjuzZ)8xdPFuJg)Xy z2D0B2M@NyoL+d&j)1#ja1DP3+m0>3fPLp$1Z#4y&@3N&)s zOx}@X%eCk=aP~D|b#;TB+3e~nOqR{3B(7j*FO@_FHre_dE1!=Z$}ATJRF7w--}%Lqosk~XfJo>UiVPPfwfXl&$E@8Ix|J|-H=Yov~^%JycyK9=H4vzPu- zD$=U~++HJ=^%~|8Clp#$s+$!=!L`;ZIO&n;!M#~`Z&hnv_Ix{kXqQra+H!9*EE#m@9b$K*c+W09 zC?}wMDL|EZ6fbwqmzN};@L=&R@qxm26gIr*-$w$?OfJ)s3=5^G*O2x8V^0bx51hO? zP|O+%n%<~CCcL2d2YN1Tt63-va4q^SkRJ4xuGRt!EqsL4B0zZ782v!(KqTaCQpXR= zfhOdu&DT#$-U634MQy`ZV$h$xTT+4>EZYUFf~aM39-#MU_ueaqkJ3l|{ReKo0N!B5 z)7jlPM!Q_1Awv@@*I`v~i*Oq!s@M=(R7Da?BY79BI|FJCp~;ZlG;M-mb~5y#{OA7N z?OniNeV{J%HI<7<+O`Fy#y?U5mtbk0I{hAuFswuS(_UW(<)#xxz777hzxkv#R$WeY zy94+#Q7ZL0O0`fPw70m8F6Iv^(O@VS5*KT2-IK5D$z)Fnt?_GaMI!I-F5?Me^{To= zHl`HAvEr@oNtY9{J}}Gh6Zy8pjUAbd$s?9fC)svNS}#}oG&BwjEGY*MoR-LE zv&Wi6O1!?vfL+rEfeyxviTmk22B$`fc+L?efn;3;^@0-Ix3OW`;rqq_F%YaRPIpD&3T!!X8sD>V+u11hKh32!@9z zSA;ojuNY);a}VFZ0gvo*-I;4qwRtIw!i)x%+Lyc6;aO833pKhPnjkIM`t$I%LHl9-=%B~8&`X?lJ&}bGk!m8akPcwr zHF?mfk8z2^viG&*qOYhIBlWkE>9(yi$%-D<{jpY$6QvvKx>l6@YGALK&%uDGu!vQI z&^D7zYd&aR#ORX44-o!jCg4zge**wy+4@CQZrqH>YKlJ%l4x zVOt08(Xn>NS-_2>9b}eM-l#I>&1q6zdUl+TTnA2j z9&^T(d*_>f;;>{cYR*&=K<@j$Y7Yj^gZB`D>8x9@+0fA4YlstHvr+z4X#8VY~dKsv;;jJh4}lXEaiBk zE*ByOmZFs^KX%`5T>}*AYXg?aSYxm>jg7GfJO2yxhfg>6er1l9#E^K9GQsV5b|5? z@%(N^Nggj;-`w6*AUjS3AX+M_ncq#kyt99Og!_sZ{_v>gvGyakkYU`wuuAr%Ag9l< zh+E7roVeQ1kWY7ah{4>(U`m)gT=>5J5Xj~TjDiM8m~O#vdm7_FdSxsJ3YLMWSwJLS zq%RCXL=)(zz{7+?oRE24214_ z2fpur&>+trHnE_?3bW=FF&K)X@cPitgMrS8D_~P{UF1=xYdCyU@_Mz*847Ok6-TI?b3l$ zXO@XPMZfBoqYaH{Uw<86MNTB|JlVV zZ|CCrZgKhrd-J>Iou;cu~Jj=Tq+friqRYQRojtwe^ z!pm6zF+dWE8`JkBRfju|sA~@!>c9RinAZ0^)c@2h;Vi@0BgV}`v`J~VOmDG=S zzY2*yJKZa*Nb7rK-;47uBfb}Qk?T>`(Wk`TTcRMT3JWxBkOx40J2@m%@<+fFC}D@3 z-Ms<_0@G9E?1BN(ZzSkL56OR9wqSw+Qanz*Xe9*(0lNK`NkD}F%KuFm3I-DF)NjTA z>HAp;2)TpL=^gen0dpHPxU>8%LE%5{J>JCt1=)}ASCN&=+gs>|XY03>P>cMB4^lbE zOuAVvVI~YR_>M4c&sR~XE^{BMmA)8RMj*CAaavHqCY$xqW<!2SwFr z%IVS+$+dPjR&c6h=146ZO;Y^PWvSY=P;XnHF&ND@x3N10S72S{}5pP6#X^kS)KAi1bTEwa= zhv9eVstgSsYBjYNg!UoFU`z^fiTqrlxg zI+tJ1=1$EJ+qE{q*uKG#0Vd=(69PKUH ztCcItS1+r`13M%Eq|PkW##IzlVi(!QV?dq1aSN|!R#_a=T12rbQ^&IbL-Mx;V_BR~ zb{~L?>C$lg?G(j`mnRcY^GNRDa2wh*ZV{HPx%-GOE!o+IvEvuS&Z~$c(PP+rV$pYSitomse%ytzpDGuFrYy!|UE| zIGPmwO!H@7T10*1QtWI7{Gtb2ogs#TlPT9}Q{19-okY5|*;`h`PJj6CFVDKHx^Aq; z!g5Qk%d$b(Cz_D!u!a;*U){@zY&C|W{-x{Z8SxrPjt2gT(B>V4E@9ZvEt?tW0YJhP zbyejW3l>Kt$0?rop-?Or=AYe$JTIuA0!0<2CuX*2mmIt6svfK>22Wab0TOg_b64G#cuX=9nR_AO0}f9Cs#F$_MRqv9$cZH<~!`?1IaQ+OJUIM)4lpHZIO zd$FZm=%n+{(bYL-m~rA_KX2)B4oeuBOU6-ypqt{&g`7m$%U&cp^Lv; z**xj9p5S@9kHp7DDw6mg*`N6?Ip8fKzlDaGsizC{?$z_vl1ktHcEh%2%f?e7I-3Jv zo|?8ju}zd-`Hkjy(VPlJC?k;|rbg1*%qHgaHEyCX((W)@86mo*tZY@L5iL5RD1OJo z`M#}&31n0Ar2%S-w8p7hEYFjYX>$TEPo#FpjqphXK2_*m8p5Ynn;KUXTj6;26A}ar zH13Pz@i|pVL(7s3!Qvb_7e=kD|A zy$B88K2)9$ZYqh4dq$Kd#yoOD8CCtWp1P&#D)A9tET?BAg1dRJEz!jMNXdVj(1nAp zPoNk^D2RxxuflFLs$}p;^-<^*eNH-;cehjdL5ROX6wV^y)7gi0V6P$D3dQl@XVc$5yIS!gc>W}@EvPl+^ zKH_@$-+qcbJc;7ByB(*}zmE9#k7k+7xvW!#m7WoN+m`x(R~Sttl)W*7N&orn{hC)- z)p-v8{UYnn8avJ-4i|GS<(e~Q-0-B>_(xndWA6=y`8h4bdt67cC#A zX0hLJ8k;5-oQ_{5q0dsWEMdgjp0ZaTp49yp?Gfioo1*WVI%_E5fwh%R)G|P9%rrwu zhmU#j{WW-Um}~gI8cO?Mn}vjdH<(888UJ$T{K4S|0>Sv7N-*@MX}OzTe;*{KNnb`# zM;ynzR24k8DyXt{0iSLKn3@f(O&yf1?rDr45cSVf9|aH|vH$G) zo4)-W2Mc1F^zHB_F1&bGc`!;b_+ZSwI38qEQA^IFCPdLuKZsXn(jBkAlF z809fh7x?1edf}h}2U8r`3U?f_FT*%TH(5Yu27uH&KiuoEQ+Zke7<;s3<>YF|WHhk2 zdr=)yCdBC|YoJT5=U}^eeCCtRIJ?Q@3l|*H@zfz1LiBh(d*0%={}ydGS1}=Dnw;_{ z$zJ^_XX7_Z%4V^KX1XQe#4pO3w5JWPd(Jh^u`ohNtNYGMF!1IxtDGQaP^-feo4_+W;JZ3^r=Sak(X&V0Uv#skD|WHfvgxog~x&RsIyW6s>I?4AFs)! zAy${(bKGg*y$>Ncx(@Zx{10M)9LYwyzxn=&cMqc!mR-LATKfJF@WGRF*P{xT9JQe1 zVdHY0U}bJ$?@Rc=X{~8(Eo{Z4s{n2DZ`=5xX8Qa;(p3NGVLU1Wf*sxm)n3GZFl3!A zE;6@_tlz#z9AOitY}|$GEw37HTzQ*9t#D=)@^vi{E*|d$bXkA)VhmK-b~i{G>hhbx z4*WGLG7amlC4G;fSGVbF=5ozeTUj5OJx5g{m>B5HumJ+TPWR_aKmiS|vHDj1Yg?j| zejXeErF6?rA&)n3OP6ucMyhdOZfEb+_$QA!`(7h@8n)M@;u+{c(rGqFtB#=cwXlF= z5`w3MitLk}?$-p<4I1Awx(aNxvAt=BA9utb7kt(;3(SBRkMg(dxgN-%VptC>JGp{q z_WdoUhH4KSCA#j;RPUx_u~vViR10f zu3Gr$Vi7P^3A@@*(md^GgWMBtQ4MMwo*4i%S<7UyZ-9FTv>O_2PyGNIQ>wYmP|qtK zQ}z)o#4+4>P5B6wY6~f}9SooD&=R`ju|13RSTfN{=`Gy!a*T`yzVB70H~Q77O-4J> zT_M0+%3%%1Iy&Ti*i1t1`)YulYEFyHVADUCYJJjbAFqG)=|D|CwS?0rDyy|su{BhW z+rL5bsFcIee)jfBfEB&xzq1J7=;`h5s+1j2_uSt>T5r0wmlr{#%gu0N<|!NFU1=ky z*8G=j)p})|w1QXx>7hk(yQHM?r?gOyi=s`#zRe9nD21bu%KwkRH)I#wRaDS;Fge-O zk25b=%?E9q-9OR-=1`|vh|#WVGVLE_!u%PjM^L`47qiM%rPHt_&4q}`*;QQoL4P{& zc^-y?Mjb&Zq}&oT;Tuwpx7xC}*m@bs|M~$fDsJ^rWM(rSZCYg3rC;A3x_WzAU;m|i zi(XC7Eodf#+5ZXr?HvfV!T z@9#Hi)TY3B>!|K#FN)|)BxNFipbMMPYJ)`6=FqRq7hYLT51X7~ELQ`lmK9ahi@1_l z7SN_V49BLHLY|_ckSDNtdP^xjCYMm}PrIGVeTkpv$xC5DVmx1l0>{+~(p5&MwE!AfUKEb43 zt3?e)D$V};!b?~yo&Sc2;P!dGY-59X)+UJ>^-Ek%;69-F!Cptgy4E^GBT@8&eRl`?=*Qp zkd(`>sy?9?saso+m_0ZYqe*c)XUg54;sm2L<5F}^jM+$d8Ih-b!tfwgXkq`bk1!E7 zU(Ta(Za4SeC5)rXAUR}8Z>$o(RtS@Yxy|a`HTTGnmNR&a3tv_on2%y^;2KmXcPctJ zxg9)y=@D7`)ChWQuH?E8 zgi6EcW5?HvVN7?sJ)`O0yV%TU9Lq2LZuY_m*n>mHrI)y%?C7lU%7pE(-I|$>K4AMi zQU$9t@fDvE?;`d)E6-6uO9Rwsp0Tx&ymsPeu+Q{~F~ZhqJl==ioB`0!_&TH!m2hgL zFc_E?pEMII;IOo<2@ngVFktl9WEMCy|7k5+xxF{dJ>gi|eVy-;CM2?uUEr*oz6N21*i%~WRX3qP zYni0VdCeFRZ>2aP*mm1lKkdqgo&&b}TDfE;#ra^;jXS`rHJcHbf}b#UPD21wz2a%Y zfL!MHP^=nrAypGf{Q?Z3ZKK`PB|ezFTKjG^ zyZuiH3uT&FVhBW4Y^Lfc#<3MDgKTi+<_{`s0N{npKD079Nex~g={NgB<`=hTUlmiC zy&i*$Bd^rEP-IwDzf%r4$UA8)7NC+@r9QAeFT)_5sWPzEtV_nxF)9D4CB; z4i+pQB4=1MW)w)n@EADI#2@2nJh%LhlyG}M8Iwm%6Hdz`s~LIHjRs64#b#oi!K>_a zutQ4Ucja7aP56^nUkmItVLfuQdz0SI&`c|81<`afGdSIAXTsCSPcvKn1mNHdPrwRa z#;+Cc?*koOdOov*xTKYqVUX}L8{|y7bVUNh4~mh0Vh4=YRU|OHc(M`zGIcu^2G!>t z>n61>8=7y_spnj+B2Qp8$*F)942SWA45LeZcP7&94b+llZpH3G6Mczc(5z8}dAog}{}$xbard{qvL zJ426+Iqmewz4|tq0ZP8y9!YR@!3gm~E9_H=N_+7V&y{@H!d)@YXI?JeLq37UFLzIq zm7zEtb_nJVw-J5X$NOPv&LAuTk?M5%_n*8p1lshgJpDtmtjeoFG+?D!^vr20$yTgTNW2@hfC`vMt%!9C)Dp}qAufa!ZjvGS05ZXIg_#Jyd#|9+<2Sp!m845c$)d{c zu|OLV5PEY2hWmS?EGiC(|3OxdaS4}j4lQKt(RGBWD?NBH_cEaowa!g%22l;%ME!d6 zQi0bc*QEnXnZQa@Hw9K`)v07!tAjg~|4)qFahCZcQL2VNOQVawm}m_MgrZ z`DNtxl~T_A&eqqr7}8U{=uQVJ)hv8zvRU=+z)0>(;J>uk(wjKQZ0u2KM*?^fK|#4H zY9Na$=?SreY9CGnxyRs2%8+dHD!h?c*X=yjmGJAe$bWTkU$Vb&DIWu%cGMKp*N^Qh z+i*PB^Bbv$BXE>6mRzVV<#NhcDs^SbBd@~Rc(#<6yj2>X!))+MG7s#VG_1=c!@l9M z{(V_wM|kAUHqInqiy1a{u(vU$G0x~f)v-on#Cn3GK79cnOn+~cNt^I5r4CVg zq&9EF;dw*;>B^N({}-Vk--7<*7*h*PM@eay{n-|8@haleU8ACt2$NhS+9N#>feX5D zx|7{$EAPFjntIsB5Mfg+>$>{OJ1jDPbveD^TF?^TUht>(&qT+5sgEl~sNU3h9jqhnI zDvV{C-b1+05J|TD0W-cc;`aT)$EZ{c|3CvcosLzpFbF#&7U+ceRmv8BJ2;gh48pQI zo&t?gvWU#mT~YITzspPcLFweYI0y=ldL^P0X!_q69~Um@2`?0)nVw;$x(Ao`;xq7N zXq#T)BcI7%prR|%y#En&|G%?x|4mL=Sy=uL(9O>NKZ9;|w*SjP{QoV}`QMY%rR^1d zs{AD9@i{^^5jQtCNRU6Uj6<+Ytl@-kAc4rrfzClq!Oo>3g^!gY00_T2owa1QV$_d;5=Kw774{B4>k|>a19uNcKSnTYC6{J|3 z;7{PaRx}ZQjv}Y*mjDPVFQEY_v0!wgT5CuudS@y%t5tfm;GHPEtH1NDc>negXmlKwTvT!`7fsMk3DMA2CjlC!!og zgumf2T8bp*=Zp>>d=rg!1K=pVywhhdOX?g`-iHr)vk`r|F31J?y`3L3uoX-M=VehRQ(Jn-f9067sx zdj0Rk>FsXiD5d9mzahP^U)XPtK0leM3YZI7jR4B;CIth+D;VgVKM?Piupkg5DF{e- z9=gzPRRK)s&obEEttwj@A1)Bc&pEn_?C-_eCj*H67a6>KpFou5pi)%`5a$nhJD4J* zMbwA?&#dZi_QS97TP^i3&iHR9ktqX4>aJbP?$7TioNGwO+c%m&aWw`A84w+(G z61D*5HTcIMck7$-?eW5C zaE&LDox4Yc5cI$S0iHROzNzAD;@GFaU4m6W-lUs|`VMg*hTm<`@l-!VaA$Ib>j|eB z0kUr0d79v}HWryIwlt{o-xszjhPjpUTm;r_%>_w@Eja9Ih_IZ%poyir81NpM^n0QCJTPyXZEL^S3`4h)@A3lVB-jxQc04l7xG*%2D^@hp&G$ zba@wb={u^qqr-uxc(bS?8Sf5`GY3`)DH_GR=_wV$7c z6K+G1?|?mzXb6^LDOfQXzZQn__3wsbn{WvPQ9o6$`l28NmO?6?wI}R@!XFs+-$`5p`vit z!{sqFSs`HK62DSvg5o6?v%wV~!1+yD$>}F_NB$Av0u%NKqpY>fkAVy(xD(P zjGX@H(-wKl=RG5VuR|ROx(HQiDySlS{?R56la;xy^+>0*95SfJw}PEo@;o{%_qt$Fv-jz*-EBfm(3&qbP@)X-aD6v!k=-U>*-+Ys|%S)i?db8;VmAx z>X@{*4j8QlD?Qqu_)hCn4j>Vub?8?+oV>6jND+Ib-Nsee9I2_Ut{N-ARWCkZhTzWb zyZ!mX&pmrKTj8H@+XQeH$w`?~Y%5RtHn$Pn8bGz-6{;ZfimMY^4KX%oV5hF~ z6!7_qY&yxp_=vZ2xa(ql*P;*6YzzcGPK}$))kre`fzTr(O>KTdH^c2?aD9c^i%EYw zKOo;BaS4)K4_32ow$JIT;AQSc zTYMa;bLw43Rbpg7!X2Ap_n1mDPlSyeZ(8n&RO&o2K7P-UYyIa+CHGdt6=eI?l;2FY z=*{|$tkQS}+c;z6eD}u~BA)y&PyPb*5VZo4SKr`^X0&C1*4Q*zU`U-yHA}+!QAH-P z8g_Uw(FtIGXKk+x%G4Gj@Ek#$Jx=cAFoOP4n=L9 zu({ZGb>lecCy6$RBwUZ;3jwG-XY`}hS?2KfSsStWOXS;6Mf>IDmdmSlZeeUHSKLQ{go3qi$A ziku1;F;Jqh!%t-ilDO0o89laS7goKr)pPSUYShZ74?>NN;eDRX=`IDAeP2~hW=3Jj z{@@fA270z8!lMI9D`$1iZJx8>D#bW`e(4Ov!d7>yqqXj==eu!@@kr=hC80|qF85c> z8X2`wns2Uao<^;trQM58wc2({ZY>Y!L=xrQTx@eW55$p_qYU1r!N6of=29AUc8fC9 z>;WPDGbWY|S6;g^^r&J3P&TylIw(K_a&?Nj^OlAh?fnJ#Ia$O;j0cT|8mN!!<998S zvI2xGT3g|}rX&g`CVW=;#!Yk-6-@MV-NHn*-y8A=R|AP=QJLu-Ohf%hw7nj?TQM!N zgI6jHmOd(h-b>M8+FfNaVZWE%L=#g9;|VLKvCn2~prMFcvnyCi7+XOw@hZMK?BFzO zH0prr{>XcSoRGFgjo>)mhb^8zxJh<5q&5<2r$V7TLtbTKK_VRk5XJ1pCVRa@?=dp* z(|7Rxe@^;aDmsals=+A3#W_^ES&LG!o$Zo*rl|Bu%~Am;yLgEyC+ZfFcp@PJK;TYo zn8MK_E_U(wg(_LQQ7qSSWZu4fW^x`+9Kv!kHnl325cCAFK%yv28J{!<@o*M@;<}nv zL*dhi?%tcAdC*h1x3-s(`Fj?t_*E4Yaz*nb*0A>@S^k0VD)xg#X64kflSr2{3GAP@ zjj?d##%h7Am{u+-a(ktj1~74?77);9^4fxxRLn}C(kD!CUMZMoi~##mq``tO%4@R{AaeZW$wV= zQkw<6jAs87M<=7(khkU+BE-jy|5LPQY55cc{JHOb9pCM{kXMf0H`a23CapXL4 z=x7@Q*Vr@<84;*`?!gb07Mz#KkJ;kG9}1sZ88(#?QJSfqPhx(mP*FJNFdok?9agY8 zH(GV|k99pw+ubZ01+*=@EAl`FbMei|`}E-pldluS8>KbZZ6wNm(q@`3G$A_R@fJ>D zV(i4U_%j4?WSP&*&S4A<7kZ`cKa8%_oD`%zj0Evdsd*hL+zUKzf_;L=f&!QH<3%iI z-IBw%+vB>|g`Sp&o?7FJch-P9kYXW`?^qIWTzVLqaIsNF&pzi1eg`z@F)wpke|DxZ zf5gi=i5TV-H5T6*`M3H*hH{Y&mJdaRmLTP`+_VYoV`pd(! zhDKHroYXy|MQGFsq9~xwS$8lM?RsltX|nqc6K&6bQOg- z<*?92d@eM-{EIz5F7wp0n1Z~{w|d?3xsnrFV-`J-ooRfFYD3R z?VSSF25fe$fV#F(Uz_y;J3|w+z7-Pb#TMny2L`I+S0gfE!YA%@?wEkVq6hcsv0o6u z!BPZMX!i7Y+=R)J-5S)!LWB@lNS1hc7&ak!u}(s zN;%wbrb&P4(2CXlvi^?zEFYOn9QtHaQsuPHivj)f`bP87J;S@&%dk7dlnHHe$E}gA zYjvcpLYIRt-Ah>K&JyS}n0^n9dDzhza*dD>g5W0|) z$DnE0aX^i$xh6l0u1Zh=5s+T>j1i~K^$a=Czk`m}gwio3yp;`9ZK?!59M=4?Wo})? zYs!&K`oWTG9#}o{==|;VES|NRTEBHm*vuJ?RN(JADHnO23)+lMj}65&%S0`VL_8I{ z>iQsk`)Spiz@on7A}o5bJgG(zhdC2P+z+8tJ8BOleO#VomNB?mZ9`N4d>Fy<*4=#j z+D_>=!)RpiSNjoW3sYIx%S)P@LC{M~-?#+U&v^TJZ5l-&l<))1`f_})8zFKQBhzK|PF-l&-~gP*N|{{j4N_lYG` z@0Z5kS}$@U)}M(COW!I61@=SM*I7L3W{id%3`M{|UHMo&^d@VWe0uBVO=JTK>P{ojUi)l%_bNy=_O&LFvl)idMYF z3HUX49Ni!%ITFg3tYX^_u6F901H!qf+4w|b3zdU8UE*TS>UPfuXsL$t(dwt;yRXTn zd(+z?e@}bX{j=E}{Db%ST<9KLI4w^LY#{=Hp z(ZjJl0_OR_G%1NBP@AiGW%tH(CY7h2mX0lON=V<}@$p%jYZIbVVUUN5&{8#N?E+Vi zzWbwG{3daL;7RzXnc#h?9RwWs{rexvbPt_MrqV8$uhA&mk;NEgUXOfS4fXGoVh7lR z72rbVkk$u0@l?)6PMdbRGq;sgdHHw__eY}&z8mo`iBn!3i#*lMfzoPMh)6iM$8xk4 zfwNpF4{IArJ;7)J767Yl4#(=UWLqz>w5MQjXMkkaf*~5yy#l}dwv(swV)Nf4gOeTX zmY&vh#J_V=smiV12F%jrmIB>S%a(ZSiS&%i;j3Gx<`>E6l|~UW1sK21ibVHpZ}QxI z-1AuaQsIK_9Vpo`(mUg1L8OXICNIJbOO-Wx#sRLmo~cq7(0Zy#Q5yaaA3jmXxKOt- zdqWD+m$Dbpsn9=C3gm?vw{t^;vlAF#9gKf8!KI?Lb9B*5MOI5az|tj1UOq>$*NQB3 zQSL|Jto`U6jsM~g$w^1MqNR5C)W(S!rng>*+PB|}c`WC@)KT@>oNX23GapW$HeRjZ zAl)4r*o=C9`OJO(V-*VU1V5hHumgrCMQ^=!V6Mhq)J&J1(V@BvxKb9)*4vFk)>9mD z+P3Hp`#{h#i*GsB$cA|YCDpTvcY1Y4_F~St!Ml`?VKgL3<0dnA0+e%nc5hrAHZMsJ z3bX>MxP>Ojy-xx+j(Q6n{0OXXufpc4wwmu*tBEGSLUoQS6A0k#hXo{yI#K~!l1sDF zHCUfqcLxETQ3^uxL)D>)68iTGJ8!JRixe~djm`d?cu(xco-Uu)F# zM-ey(E+cyJrb;L}U*R|(yOr))EL_w?x-i0IE+P+2=&g9Bo+y}vwDh9;R=MzD$`BJ} z3|$c1TL|GNZfcj4i5kPaZnms}pO!iZBoQ7XvI)eg$H%gkqrgc`c)w70@QkGuGu0$h zJ{*Ihqd$H6@ved_^TBT}b8Ee!vZ~dtFAMwl(*x?Sj%T zi5fASoc@(OD;L6h#_N_pL5bq#`l`;nt9wbtIo9TjdLqrAgsIlI=jC}B*L@a307NbY^=Nu99>sW=VPpa0(_Z^&`f9){t@jaQ8ETcJdU`ico_0Sf?6QN#x>E{w%8wBPls6K>@ z*WUGb@uHcS~eGTFKF!Jyshdrd> zxb7SYZQsP><7j7lq&*A=F-NG_ zLTvhze5m9qA+{Vv25l|8{zUeR&A+OT5RV_Dio}I&PEmvjxFBp%+qkPHRv!p^$A(^R z{2db&DTHrJXQ7QzrIt7m6n=}plu@4I4bDu?-_H7aq~=@Gkpo3%j5}y-6_6mSM*p@f zu)*QeKq1!e?%6k)$e^u?k0aCM7pbPur!pT#2}u{rd>FG2Cbg->in7F_#8j!ov{CoYz6vnbvKOT{=gK|>0l!?pZY z)zk_sZW4!GMvbU(Y2+XcwM|JbTY9bsd)|stii>4rMIODxsM+H8AC2z)ZRl55l?JV^ zjc?f8#Bn8=M7-Rb${=OF;ZaqrZ3PptT>CDQ4i8or+axjirFZQhC?9Fb`MVQLf{ct4 zvBQ4M{er1$XF@GB8|h;6+seD<=j8IY?L*m>Sb7D0xE?nGyNurSt&n46io->_Rt^{c zSknKrU9_Wa+gkQz5!xBJ<p22l~Ng~(R0YGaYpSNtP`{x4Hj75k?mk{dox z^yhv-YwPAeU*A`{O{q1h<6PT9LMZ9}zYaGEN3;>JNVb7H7K^&R8k=f6xrA<=NI&RPO+y{N3BJ2fcm)de@7eaPVcKzQ& zw{C51XV8@SI^foL;PMy^Ml9#(xwvC7V(2Q%h4e4Q=9Ky}i$#{XB}b&3HW!?PhE*Dg^|OOp-aC8D-J77$%K1{ zJWUv}E*>vgnK}(7k_{}4a6Pvn|2moY;QnGLb_Y4F3TEbMDa_K8esC|G)b#LVoIXPJ zn8Ej@uNXkFtk8}98{-TIoL{2r*L+Nr@7>dRzjdcGIKGH+v%a&fOFBw~+;l82%Uprh zv~e6Rxn*V~@bHY9a>pdHm#p8xL&lOc^uddcf zLhWQMiW_`*&nmTH!PMLuu~=TP7k@j`_4QYAPF^?&UZ42r{zhddv^vGMaCoC_>coV9 zGMjlXlTTT33B)8<(yK-WJAziLB~pyTbiKA%+afbb|I`gEL?GBh)w)W_xGQznd>m3F6;Jz^n}I%$xE*o#Ez)$D%%?|9isn> zv3F|DEDW%=W7}3I9ox2TyJOo{$96il?c|AV+qR82^G(gvH&t^m2m9du0ee^7`&#Q- z>>}NE_P;@sahLq&qPhn#yVv;K#s^C43_Tpx0m*qR4bG6~=f#kV#dF%$QyY5QXZZ7` z$(u;4@x?2U%&$UIITIP=*cXH#pjRi7&7~X>k|li|^=BlodF5Vx zIqyy>(fiW30C1E}A;dpRiAqC>yw4_MEW|Ju+V3Dz)ZWN*NF7V5$F`06YG5T{xFAo& zxyLKrSXhuEc&)lMXQoU1-dJ{@FEX3RDTnvXR@)pJrZH!vi{c_C%A(g4WtM`QdC44! z9Lu($&5SH2pYiudqcKknLpe3Z^2M1J#Y=E$#RS?Wc6?IWA3P(Dys9Y6EkVx9Q9{D= z<3$7duJ#3F@-pIUnQF-MJJS?Eg?A_`jo|;7At@Qx9r8~=9x78j3!01I2J^%D+XMB>(UtRy_X&*jxYE!fysVJ z)g2}o(`+Bi+r)pzz{LN8TnGNh>%@dLAtZ60YxiFMZuYJa;LOg1xNA#q9BpgvAcMs{ zjA^b(?e2Tbyj29hv;dv3;BPyof_>)SotUjX%szz5<^?}hAV*ey(Zyfc!P+_mZE34q zJMD-bKNV(FQvuRb&!(9;|$IcO6WRR#b+c zOXVh{PRsvZN&*Ssv}S3IFYnE#Ygo`4{e*<1avYGu`Jgb1B>4<&30=cT`3?UCDWtMo z{J)}Q&i}PT&G6sS;-3yRBg=m`s{coanvvoE-l6^voALP?+g~DLB6z7zB1+D}U}v|m z10Ya11ZD%KhAtnEW7-9)1Boq|npXc|{4nt_ZVH{v#0IwK{6ehx7`ZFvD z1qDRR*k#OsWl0_q7?Oq85J&W=QB)+5G?@zY^e^Jz%Im**VQWl<*(Y4i-5!dgS!ju7EAFgABsQL$bXxXr)KHg5wZ0L=uo!)dso@Is)ynAJ&gCz=8>ghV%-^W2og_ z+I2fL5K!#}0y4(^sNhWkMLCNRgU-#Z)u)B|k_!4)53`{Ny?X=^P@p&fI8zQKAx2oK zdx!a2y#VFt!@c@W-2n^X=K8eko1NF40YiAa2{xzrJ`7Yv{;qNg%>`y8CMJfKLputHTF->-e<+Om2-DCs2wC_AY)A3*sdR#4?A9a`K%M>L)co zgtP8(vtqtq(E1rcE{-)aJH)7q9gA%xtZ(3pe ztT3tp0QG!ga=QEb9nFavD8d4_enYe+$EC%AK7qdR3xB$ed?W4x>Obs=zOMsScnxc} zO|Q0}zK7vlgZjL`9eV)0 zieNT?cV8ln`i%B~u)@LKQH)cgk_UkNkWwOJkaD((Ai%(Ppjg7lvW^Wg4Jb3|*2>3?3t2(A!Z8GCY#?FHs5e_lqwP80^S84Sd zk#ER)w_{zmS)jf?%_z{~UIbRW%6ACbmu#V1$V@$*xB868dA)=95pC=Utvx68+ix`jB_Z7AnA zIEg0P4*k6sxQdv_2hRjfLofN7J$<*0w1OsA6O1#|bG}y5`BuCYpw^HBysOi~r%?4< zJ$XTKon-aFoGR1WxO7I91d&K4^EwOdI0I2u`=3q@vz)ZArw?>gf>x_F_;SnJcjax` z`RQkm-@}Q=zJt8(wUkw^X1q=bUO@x}3ZE`+LSNqU6T_^C~3te7)DQ|HSBvK92D6L|WVFD*wE>M==OCkvYe8!6c*eJooi^ z-__*}fr*UX5hcFCc}i6k>vXi=23J@?+*DwQ)!Q}bs0Dn8qK|P|Xi_(7r+WdOk7Idh zg^JEQtCrVYO`hNZqAxoxn}ITL2dAOlV*K*XZYA7~-cQ0siippiiYP6OZez~(OGf@_ ztg8UcE1L#eI{28!*9_~U9=s^Eyco%;=*HZn^54kUQ%qexW`(vcPh0wJ*L?CYp8nfU1O}@0ywNXV3GT1s4d&U_zGHl=nZbmX1#^i zrFfgpmTHTMiEpawvgPkQ-))&+$m9MEOb37EM!7^|0YMx_r0if2nPa_NC0GeQ&BlIA zbhmv(bq@QjT4}mzr4->OkmkzORY$q|`ssWMQmX z`sERUkw&*h5&<%aok~D{D>$bf^(Qki6PHeIdG zY)(=GQKkh>AZ*NaLUt*1uYyJs{3E6!le_wqjM z)NxI*aF#W?TMGLSDUG8(Xdaklgrgwvu|zkE;p^)0@}Rh%NKf&evMfHZuL0hp??Tr>z#h z?DG`*RXj~S!1}PdYRJ!@ld^bEK2NLFJYyFv^yXz0(_xFkWd0~?597qa-&FGu$uoCh zEOB@*!m~h$dX@W}`79$f8H0xoNL+F*iEC_#ZghT8y89Hk4b&0OUQ*VABzTJr5|>u< znxdaQ%yJ~7mWSZ({tiaPvhx7Q>e-o2yDl^-mCH{PrY&*f5hl?ypgtL{cAoc^U%r$X z9by=r?^2DZFf?o5W_vF_&*Q7*6{8YBQz2aj^`{n_bCzBh;Hr=)=9ggz7w3x2|<>JtBT|m1QUYt>Fvpd38u-Y6QtIo}U zR+o|G^k`nHl4*Lk%%)?c49@_+;{`gKb1iYXJE8jA`Pe6!6>S6`^j$nkQ)O_1U!pd> zF4%CF>WoxTN-08HeTu(j+WWqZVWFQdha{c6Td4$5a1G(6V6$#IzCsiKl13~c7;{~z zYBzLIKfz!MY5_yxqiC1k#vhxa!D2>*+e!MUyRgv@21z$mSZ@&o%xcmE-+AU%;q}Vk zE!xq@Z~uK^+LqIGAX=VH$5J})^y4!NKUQ;HJz>YHz!4D;f$q;rs&BFwQxm9`%b*&{ zq-27yO}iu2`Nw*e9l&&Rco8~*d5NPmw=|E@X`>W<-q+u`IE}XAUE$-xv2y%kN!(R+ z=-+062Clo@>lSn&rDXg$PN-+NN8yd75cBLX>(i|Mo|I%?^6E&b5=_J2O}u zDX8EUOxuH;%OO7V4ED{S#*iN((HCc3o&LRye}f*Jal5zDbx`p~&T!+p+5yR*@RZa4 zfE<#9`*+4RBST95h~-&4Ixb#G?F9P7gjVP^<9dr0-wa{h)(>s><1Tx#OVopHaZs6d z(Rd&4J%=7;J3W*qz@a~jT8p{ll0SKPvTn)FXh>;@PmA_nj=w0pfOE|o0Z388I6*P^ zqo@zK0Ls`=uN>Xjtt4001btodjh4rjSoZ=)folq3&?9ODFI)m?I}s-8QBlPQotU_+ zP=c;7u4iw0CBvz=6*L0s^I-G>X@vS>#b)X(iPrku_4Kk=ey+gw`6C6V`4=ips#C$! zijhrzsFfwqu(hW-ZBzr9I)w;qt3j?LYA}jm37-ebs@bNsGD-LP;%-T<9>bFoSn7(p z!8X%+iJ=DqywVNL@E<)lbu6@6v`OX+wB~2uv2&nY={vxgknLOt1J$$Ybi8wYQ9TpC z4sG&LvVF_g^OIq2qlVhA=5$o$vXh)mnc}=Z-WJ^JartUqjg8NoX_=b4T$M4FFVrKp zPt_$o0p!=q$&}6Wpqi(=-9&)w3_}DX5#>XnW<ZRd@XYosxLHpmCk2Zj?hv~?Tt|x6t=5zwGVgfl=3|Jy`GQx)Wo^#ryv1EY~ zeDkP+kIRC+4h~^N=U?K+je5JLu@c8k-q^CCA*I=lsBtnwX9Oacds6gt=p1@UO`jXR zvQz+vX8RIOts`N>sfJ{^a(gN`g7P8-rD8SOY!%5ty1oae>hZnxYypzXNR+-GxNrTbs>7wOo_a+uw*IPVjAONV z(x|&s(Omg}z5+W&mx;27Z=IP)iA9<)#)?25cQjb10=pkQQiV=q=oB#TG_wy~ZnsXv z3l_kZ1=?%BF!RV>;%T7>U7>mGokd^73R?^uHnq!qX_Ys@GJCNh&Rrg_@8}cEU9DKC zA8Dda`QOVr+T(J4PUll}rMNX=n&K`yi6#Pq^lBj$i8s;c0QuR9Ej}D8VcYsW9f@ns zH3y}bkH(1cayInWIVaq5LL=pc11S6Q#{v`v7|!35PjvU~NcdTQX193zu#3L?;{W-r zoYguSu>4cj9{T)L9rJX=T72{m4LfCZW0wc_nXw}+mmW# zYQ{RpY&o&Nz)n-TB7z2pl*P}gBBU?Vu8U66Lct4Cf>3h98*q*#W4x;GL&=bhIEHMZ z5bUg(waaP)q`u5x-Nfga&{C&dKap4Dah(enYQU|MRSlML7RYUSQ@iIj!OiON=IE{? zOhyJq9q`{&0);??V)z~zU(=Zj44?0Is)zDS?{ma{m?iPD2EX(SAQd78<7hL}M zJ2+K_x76d&QKH|H#5su-)WKM>4{-#40d@u}ihJN=9{q7=nxA{c7(fX-WOtWnpP}?; z41WE3{bn_eO=!-|(~R02T-V#zM#)`j!im#+-9rm^{V%rJS>alkW+UNV(f&o6KKvz` z6{XnJb+|CsR^wE?%I_uAalXyqE_Qo)Z|4RUcJttp!`aM<#I-=5UXD{MF*u!N8ysJW zs{9&DwYD+8yeCQ@{Ng^^!X;|n83|_N9fw0n$>n*-Asu)xP4>cuKPWu5z2xe=!ZQpu zWD4~jkVH#<_ndX&dm>@OC4oq7i)qCCaS6zFu*TVZrJuyig~t)`_Wa=zWu_5R&UQaN zr014+Emxra-NF>QzosF8>lAQ%3^4s%)ihcYtA`(gO1o>5Y%su-N;v z5r`$KLE58n#9+fEJqLMZK`Tyh0fyD!FM8}o4mNxk6{_==bid+l<*c*$+HQ1f5g;xQ zTf!(7rPjDdO&p#%*ItdAnh-t~A-$KtK_Gk|*rtR!VhhvJ3WumAb?MMk8hdkNl7qp( z#3PK*HaiqTGt#kyKh0r_j}#RhVn(1Ku#Iq|M%fz=0*vY+lqVItZw@ITXl;Mn- zHyLS#AfNI8rBc_vy|L9u_~7mqO*tA&-mmt{LpKpFv|;&mlAfSZ)W;=sKi1V+g~(Qs zhU9w(jY~qZdfOxoZcH5T++5T)S8wGPuuX-Mx;qED`xbk&de*VtUk;{=x zf}pE_J}Qw@g>wAs`+yzF&|fvXyA?|=u(yD|nO&EO6{!8vF|`s7)>G}ysJg=HXwg$Y z9fVP#v1~cz=o@v?@@V_cKS`!g=3VDy*Mr|_A&kOwT3_@GG)>oVW%U;EetY_O*OA@b za53_k)D~oxJs=l=KycYO5hu zz9RG>#K&Bg(cN)_MUtCLd%vM`v7??Cq4l=3i-dQq@AZIwq#fxvX}gdiIo$a1i)2?^W+oZh<#ja}sie2|9`Z31MEjI~ zs;f1yV*`w$?JZhuEh+P@*r3~t<^g52v2B^wH;TH8?%MfX$LhXVX;OJYjrMcR;S#O% zhMZH2!8Pf?h_TwvBi3ECRB;N z&0yERBRRHOj!mA6AY9qGAnv)D1+Jg13+7?`cEl9 ze>T-@9!9<=BK2S|;O>a^w^_Y{{AgX^3Bo<^grI!GCUPoKe!Bq%u8EE`=}n@nKZiE) zG2DDF4X3U;bKE<$T%})XZY9NoS*Sa3AQ<&)2v` zZ>CrPnTXRuwaA0A=;=tT@9=~iehycVHGGmcm5P%Da>*7YO#F}kDu$Ebbve7{y^Gdg zZu(yXfH)%Chb zjs@B~<0w|+3f$}Xli0tY>r*UXkEDc#WIuG5v6X&L$t%NTW-NP1FBfdFvmh(UDQ~^U z=Vvwy(Os$9IM1&H?%iHuzrkD{r{;r->a!orIY6`_w8XB-2dbRn$u2eyzq+%VE3%ka zV!lSQ1wN7yuwJTrAvow7agUD6$z3t0zJ^ez<{s8W;t5jB&*|Hq$&8J+-;JcTtyG<{ zh>z;Y9X#pq=>*bTrBPYMfb-Z{vyda=(J2Xuxy}19T&bOGkvin_1MW!ZPs@CBS$tX6 zB^s7?M=k?I_Aj`Y77LUsqBD=h*$PJ8W!P^e3YEjPK)SI&#?r#(8>Cg*!V8+v1rEseFRuQybDEVYE~9 zxun_(KPMby#Cx1)DJ08a%O{TKuW|^EXe*XLs2*~qzF-H8E)S`@TSwi5y{7-#*$O!J zCRKcPIaf6gO|l256U1x84PfsHTYj#IAwG*_@M|Ii(nYRybTnwfR|n_I_!?!OEuvxj znMYy%?lQ@jUq-;GCz7*c1Bj~yjRq5Nx*5GFynZhlTfW~*#a?LS9pJ;~39Q9yQL}wZ z;`HevCt3gyw>^2(RhhGH-iq&j`JT|DJ>Qj*ifoc0@-kD7a6BHBtvD4&d`avxQZ=2N zcy{FGIi~y`JIoNrloS+Wh7lawCdv`13@Q1I4CqrMFknFQFu`|fhuGMD76umyhB$ID zk6px46vdPP=QbSL$cS7+6LH-ievXm|=DuPijnVFQt<03+o1du7@R1$=DR|4D*Ye5| zdbZ3BgOgQrq69>HvYPJiy zM;~5vMoCt*q3tiuoMLlAZVAT>Qsv`s7Hf+BVjLA8Hms^~*k{nRzTC&huKC9v&Cfnv zwYHL)=7NIq^ReGHgf!}c9*bf3FwZwmR41`6bd_V9xp2gP6XTN?3Grwh)nMg;+syZEhP^U0hXzk-N=Qfo;)kE|- zQ(i^S##35OH7~08vsI_TdcIquc1hi05usv@@vP^3KEX>et+?wU?p1#)D@)Vqkm%pI zr+m@5FWar0&}~MIIe7LSEf`}l>zAua1@O7EEP)~G zab-n}csj($EW4-+$MUIbOi7_-G@Y5= zqMS#qQIu9IEZu$Po#aW93@gXoVuE_rBu^fK*w2EAdg1JKw`3ZRjBIwAFdlwRGee^t z1e6(yUyT+^l#wovw!~O+gRj;|aC5&WGzVjokH+aO>$T)F4=&H@Ty9&eHWoY_;#H_X zx1hx?lSAIxX|yPCP-t1ll*wg%=gtdqBRzAIlV#0~q+O3PrUtdgRm@wz9(0kHK`~*R z?Zx~h2}0zqsE6NSfK?%%t;$Lz)lv2qjPrKGTQLIE=qD>uptjh>@hd3uY0xqa61D!x z$ek2nVq}x^A2ztm{TtsFe<8*}8 z6R;C^;iV>L@0~{$)R}n4iT%0f2KA`x&&Sbed?W)S+U;*3yv{{ zxYn@K_X&9Ftz~Kv!Y##o{=Ov;cVh|ty$Y>x2{!xYMi350St^dZ;icSn%q>Lb@n9q< zJHhn1nC_h!QQOOWSy=vPnWl2LmAuK(ag`k}Z@_jVpE*ErgX47bsUMl&FzH2QRzJ&-R+;eg0ndv@@yt zbA6qe&f9RD+0{2``-iG>FVHd2GCvN>uog-Jp|seJ1RgA4KvaN;5s1A78*d-_GYF)W zHrJex1BUYXM<|2?)4Rjq0tI1K94iFk;>{ai;6S7yg+N0K2?9JQK(y+Ioj>C!;PRJn z1H6QPj}OR}HA$Ta=jtr9_upL&S=@9wAyi6oGRE5_f{LKPti2f&N-1J*s~~bK z>ObOa0p%oSya?zIaVS0ycDNyFIhBR&ZGEu78)U&eUG&!w|1bL}+!?SlP|kPk3cnQ=-YLktYG7ndYAGkm)g|nr+V?mJB=Fae zP99b+DHK>j3OI1ymVmi`L*_}%j%k42%r@x@X4E)8*m=kuNS{5Kfbb3j#TBIgW5A1G z09GSC3)p+k0KXd$1J((M+Yr#d+-iH$o$C`0ESUF(VHW~;M4&C;-C#(FKwqD)uKIq9 zaqy4_xR3P@Hz(1m2bwAu7H~hz4?8JUbabErm`F*`kU>&G0R{~jIErZP;1A{qWUw!F zj9h?EQ#=Ej!jpV`tM;3EpRb=w&UH=i4&)be3NTEG21VSpUBG%Eso+#A{mr-L5kU9L z@9Ycx&=2{=@3`Rf{PZ>R@Llwqp9T#08SW!;_;e97Xug{dh8=k1o2@DM3tQc%6m|pi zcDs@dA}|vey|CgKK#zP?0FCJ1j@8RJW$RaX2g&};YLIPDx&U@C3+#pkM(ygGWEko)O`oKX`X>gsUXEJUmpD!Mr|yl^ZI^A1tH?E_d-C8O7!U;YYeI@dpn*_;)7PCvERo-F zv^bFp3Tm~RUN5Ri6HS^c9V)}i^!L&H)X1QDe~*;C1oKNaWJP;=neaEVwi?g(pN*v! zQoRpl?(BbRCkISrjow5&sz*giguw6Z=X0@_Z1u&!g>h;+i!w*^kFa@TwN&)pqmR)} zGlstUSc`P72~B~;d7%ZDA7zbe4x9bw<4U)?Tv-<~Ffd`Ar`GQ$Ud+DM5zN+F+t|z% zE5;%N`+;_n3y9tdE2fXrAlDc!j&KK0@*G$YP zFqg3_qHCDIfovzI>3mQOi3AI1(M zWn)+h=M+b8f=zUA{PeVr26)-lT#F6W0#WAP33SuXp|NAQpMS#F#ctug@@z$IVkwji zg-MF?Xh(Q5of+MxtNRg_vYWD9X$GF^s{0GTsSZJJcr9wU%6;+$@0nyTtgy=R=ARi` z_`EReBrPkt)E$h;b64Qc5;l&`+nFo+F4og!*E6Lo$Kvr9zGW>N*`Ah>eNkOk!ihpZUyH)`qaukHfs>w#K$F`YudDEDNV4 znDhC!gau)-S1gZGqPBL6 z^3sHacXH?;sU+OM4hP}3d2!eao#&zXVj7#|buV|yh?QWw@>}KKRBPcu`beke=@JR> zOMZ6Qx3Yz9h+Gy3UrX>>)t5T!YYkRQ$kLr>zlO?jKdB8jt~@M;f+fw_X0q382CC0@ zf)2mkw9jLfJJj~Ft3679Ghg8KHCb?Qj))L9pqs$TLnxor5(QBIuPCWd?;QT|YUHBO z*Bg)!QmEEin;S(cU~Gmt;_^cI{uP}>0_?DGUQ~V|aqb|9q&6dP@Q}~fDegc@7o(m> zlwYT=eH>K;3)FxcrMiD}DjN$Q6D-d*Q+hy%HKklK|?c!h1MFk&?HN&qb$mt$AsCVXGSL=i~0piC!UL01{PW+1wJ3FFMJKep6;j`GHIF~)sj~ZV4`d-Ko)esjOIeqp>`qHB2 z&~#>)O|;OvxoKoLA$iY<*1z^p<;-)9Wn5aQMEP?CN)IQ1o)o?l44sTu$x5oiN_&JY zIZ%CNqw_4xT8I|0*I@-Ox}eo2UNR9VH~`GJVYrWr5I>vWW{O(gA?^!W6*6h; z3PKOWm=?#rEnL4v;O=JT+{g^70hL31tkHihPlX3qr#Iy*nBz~EISa4lbt%w>qMrt3 zLR+LqjqJb4T*fEU=P@A7PTc_?jp@_S!PN5b#xV~!3)sJ)g@Dg>;xL93Co}6X->xK0 zj=cx29SPf@!BGaQrzv&cv(5Esebm?rjooQ;>!w0C{gf{Tx5?D!(r3ECdE<+6)heAF zZ}Ocl>&o=CXd@-=_|&X(%Zj@wJRuQMu?6nPj=pi!QXIN5?@5d&k4g36SJNe2n9Yx- zPjTDR=TDFeq?gl#18!UpypzrSiJ|5J?Peyggzmf!E4PCcu%?B+!|r8s7)LAxV6ow} zzGfqvdgLfgDlC)v_?^pwc<+JATp^bbQT9t4l5voNS<%~|9p(=Z`T=1iacPH&w#Wyu z{$aJDZf*=U4=-#IvNU#jmhGm{Tyh)`ea$coo-$+q$prxRzn$(aOc%TXS9f)3zgdnS z8_uY?fxOQEs@-D;K~uVV&7(H`zvN$zLmZID9{a(!2~1FoQ7esjWBXSsU4q-;I5d9lfwlu^^}#&SW#85@IJg2l2wgK*yMNj6(< zaDscKdc9i{${Edv&h>*Zvr#c!h;1w25Tr6pzF7$ny2oo|`EbKRbVKniH#azVG{?i1 z*N8V&cW9j0Q>uesZ+5)?4&{rN*^$Opwvx;J{)&dBvUJ?^9z%W#%7=zgSUgI3VGL*? zG)(zxnhaWzEM=N!Ix@>EDZMD*&R!SZ|f#=cF!9Tn9 znfIBq(kg}SvlM>phLD4#3$Ch7o%)aEIaxA0#ZHOUsA-#2c9(h%0YY!{Z>3;#`QoIF zcwO0F%EpRpic3C^&0a$kab5TmdzTYT7#oiFUD|wPIFWn^@%o8E+ur0#lq?9c{G;wL z17CsrH9r)Fo!Ds|wzFt|;THF~2OaBBq3*~*4d3xRjMW4R*$9+Xo4R8H6bb^9sxHP{ zKKxFz0+kL_TKs>1ptk^bSvorz?VYnQ?me4Vq`vVq5+%t`90dk3C*z=^OEu1CGOto% z2&rCaiYmJ^?3=++XkB1>#}UE(VrrfJ9&_?Euyx?iNN~=@A`#B`eX*z|96`#7BX%M1 z^xKTUsFjmwo8$H$2&L+3Vytk#VmCFO^dqC5HDsnNU=Us+=cf+Ms_rs16dmi?lC#i8 zG2X!>y_+JAOLv{MiXX^l`j0sG2hBrqd4~J79m#hmJu)>6vKX=>JX{7GNrpaVts$`6 zsq2-o!J}+(4W^)~?N8byJEm*n<{svagRk3;$Uyvc;*m$V&FY3w`FD{V24O#GY|FVG zqkJgN4MxoLj#$ffZpL&bnkL}fUFRRnTu#+L*%zj@<;uGqs=GL{Y{V_HPH_W<1oRF^ zB6_`Wnvpl>Rm}pGE9cU$@kX?w{Nlhw)18O)aSi<|3RDOWsK7AMh}xhAvZ}S64;!`W zeYPt~m{*@S{r&(x$ExMDqL`07v@gDx1^ihywF=6HqA^C#ezavC$^~9W*9S=o(_N!h zWi&RFe%&2kF445x+`xd~>@9QPYkaYb0Os5?1#8v~iPuu54e2Rb z8UlKUqg?%8!mDSQqd9#3-OjB&Qz_$orH(3!C0=omX)&&G;3)L~>A*00Sepy@Zwa^Wy4Z*3H3z4rHt zSO$NS=Xd8z+M-9gnwv#G^ZV8=%AhOgf^9Wa+0I$%0|CdDyZd)^SFJntSw@3pI(2b_ zeaMm;bzE;|N!+OvS{((`8ayi2RwF56|7(i}>xE{LtZoGwC3x}@hMQE!x36Hn)hun& zEwniLd?BRAU#FiE&r7P=FNGm-#s7!|#%P zC!wTn(lFtOuo(aZPW|GXK_s9g>Wq>2usrXvCemf8mv zw0S>V8!7`QI4mT3<46rId5yQH-N{2t7H;1Qab-=Wo}KoI`GL>Pe_36Jim9#1VckD| zP&zo7OJ>(4y@ML*mv6d1y;+r!rPZ=p@e<2L)AN7kL;R-C_>+OyjH!CVhT5i;3i!w(B1p zvT!miExB2&vj;|VpBf^eg3$9Y?$0u=D&HRxcOj_)rZwSh@a13$IAGh#oG?B;JY=vQ z(}>AO>{r%klqYTR`L?J%-=4;?6;fxryGfVQpyo)BWj;K6BYnUS$RcBX&B~f%G$3jzr%U$o&r*_>^VJ5Lj7(mli1z3z#N`R zQnr^i*7(Z~FF&0JGx%Obw@VdH1$Gm!aIZTSH|yS}z79Harik>4zQ%D3{Dsa?PNiJ7%G>3KZ* zP>iF=iZi(3yF@1~ESstUl4sWKWTive;M3yehfE~gNxh+Vp){6Gw>zI9mCBl0+X6H+Y@cz!YoO)aSnt zGC~vyfXdogt?&^^GMURe{h9R|(b%uY*^GjT4yPK50tS>3naH!zCtKfZfTrvs6mnz{ zC94zRjZz|zgqhc~L2A537Ie)@+NjuwWgHM_a{o1b<=R87%>y5 zu5UFGg0R3Uz*C8EmPg;`dVIhl#l55~sov!tmnA_f-Fs&Q%MSN$7&U)h@V<&{q+hb) zkE9(OdvTrT<81s&RxdeZQiNEU%Y zuA01%Kdr3OeXd?_w5}ZP11?vdz)H%R8K{hSw{q<2;5Z*xxQrNGQ;fp0-p}DSI2;ci zKI(GH_>}rK+=3gaGwd^yRpz&##1d3A)ympi;;=@v^D2b6#Y;!qa7)3@)paneZ+wUy zbEDxdXq4_a)ae_$P39WnymEQE3(zd(!FY{cChO+;krp@w_0<9@37L8}TKC1SKZ8#Y z=)w zrXxNxw(j}mjbW_LI8v?^wqi~V73McM{L>Cp@pWZsoN%&ESQ4~0Am6Ot>dGG!-L9>O zwn3*ioOH$jrZu}dIPq){V9QqsZdD@AOxgK>U%E!~W>>Qa@TM&QHkh=ODcm3ku}gK* z7&a$8QlojBb)-(%KC9Ta*3Mwf{m$Ak(5mIV#86^)6Ks~G&ktg&lk%^gtJ8epOXJbG zArl-HRGT6YPWGBU*}1q3vP;2QA0X_o6Gv=ZbICWzj#{^>(xyU0G}tzbK$3J}rK)x; zQyI9GBN&@jQF>mQqTQBx#02=KYyVc z)}-vmi+O>QaGGP3$o^d4kf&{s=rODVSG|UZRoJOX>%IA#I9-n zNmtT89}X~W;oji6E2AR#B#iLM>{5XxX==PLx^{PM3Oqz?p<#`dhWtiVk*cOiJ=0g! zdFs8oXHiS0)^C8x|EhLkCIjb+(hTQP^+u`t+mQ!?cc#ML+woTtJbm4Ze~n< zhD0s>fvG+AujSI%?R_1~AO*!+Ab<8Dto3nev#cwIJL~5yjTG4*Lqq)vOks z*WQoH?7YcNx}mi1dmMMWpDtiKEz^Ie5qcEeJlv4*JTwYl`-gnt1glpd6u8T10vZ}aR+}=R8tPXAlc zBOINaDz5@6AP%PH_@5iRQXOsWH8{?$!x%$Qps0F;5VD#$W=!@Q1x{$anR)#o>lx*5 zLg$8HQsewG`&3R{e)KNko?jn>(!+wXauFd-&1e@4di9;J-sv87h%7SxHfWDZE$5%s z&^ckoE-$C!Vj>iRO&hmTXr;&H#~^H!J{A%>QXDBu4URhDd`5m;V^@59uLH^1?RGrS z4m)-=p^c(4kA!PD#X|a5v%f|ZPMc&ZxHGdL2~A~T=KAHvyF{)kuQC7!&WMMFDkx1y ziN9(yvozukxIWRQIcwK}cN4f=P0juGer0|7zJs}ryZ7(UaPN*JE_T|}TCUBTp60Z{1@Kotp0q=_9Cir*>Bs3FR-Q{g#`ZNO?AO+?3k0Mi zXVBYPeDOFY3!yKqm z<^W#zJAW`c+Ev5p`L`J;OBV5uKUdkp^9SaHEj=K?EUta--elG5fNcj7F}|^{T}jzw z{QeUB>STdBs^Zs6R=}P@Rp5VP~NE4mGubVWVA*Y#Z_v7_F=Nl7P zwZ6r~(Nq~Baz#7ez_bLrKW*-jkhVBq1qXvdkPd(2zA{)!t3e9VmZpxsc8)Fn>EF z6RL(hMvA10DXyyx#uW-AKCH+_BnUU|B~)*5;SjF6T3IF=12D8nAvs8f*tw6Ub+sFX zJ+}V*-jdb7Y3}Y~_CW9*_;PhRl%P8@FgP);VwjdE->yl-p1%Mkyp2J9)Nx|hi$2xn zw-l|ry33KVnwa(AuAMJM4D)+JWh}+yiCX^5t)|GV7@TY#^-KoeSLV9cyB1U6mMxCamidg;4HHC`Ce~szdtzQDafgt1|`jJAV9rq7N2LZwdGzLp{9gI zpwDvY=D3RGvS5IuJYyqAWJ8wL+8Sp{_g9B0&L_JW#%Ur8zYQ5vvH7e4FQCj>%L2JX z<9GKnm##9mIl{WAFfX7c@ak03l01>LF&fFF!}?c9rQn~mzLvtAH>O~i`i_+6t#3?| z6P{*6$?0Si!>e)EMsV3{C0>vb(=u>mmqEZga6W+^;di?v?eB3iZsAZku53><9f<$; zg+bL{_S8HKwI_cyajVrF?`iR)UDZPeq4fpw73m0KcpPFA1HmNKTPlAlB18GAWs#IP z1WO&uBVn;6gY#$-67n{xZPbvkbh1qxX+9wTi;CO|C06wdlB8i7^M6IrKX94I&d3sm zhv&cG^MA;ZnK=LJ^dAjY_W$m){tpz*$jbPCM$zv7xdIFVLZX_X0y<{}GUo+(+9e4O z3_>i3;(0CVX%|S;1tk%WpafnBtAtia(e;Z+sr%%1!)yBUyQ%w!L?3M4|K|oUx2B=t z!qR?xljw>-5|TX{;$KV(h`8k$W?*38|1u=^u$pZp?M*nF@{>=Pqj}A(q(IIRDjMM2q{8M8MpC*a5zjX{* zf3dVKx@>j(yg zIV2exKHlB!wYrQt5N%zPcCZKK$)$kwrvrm_a0y!h@lA%CX><+!pp3@M0nfb#68!={ zA-+%`SgJ+>S_29SB(^7A8-%xobpX$GgFGoK2W`|Lx&e%w`60Ig`yoIA?SX$%ZxCMV z2jt#tPc0cR^sNr!T!DwIgI?q^KnX}o{=+;B--FQTxA8-+GL!&Y+g{tmfoW(KMD;DP zg;z*e1lA~^{#gM=xqxx`v4F)ZtkmGV`i2M+Hjr$n5$s;T1r)@+{Hy@`w+r>0I6d#Z z&+CwL^nqU8KaU~6v^2e|hE`?5<^bcpEx_lO--HFR?S8MDA_@Y71>_3}1rh-rPy+2i zyY9R<1$3vv9BS9I! zf)@a>A$d{YeQ(dsn*QC?w{rg0&C3R2Cerf#4?ps`zWkAS$STPWLyh0OUrU<2V!wv6 zc)+>*=r_pW0a7*)A%U+VP;4m@5)ep0Fi>A#AP~TBXtp`@YjmIATXokJ%Kt?FG=KW^ zI%)IU-2Zdh-yY}-TN*V$jSj5m%Px-}7zU*Ggni~)^XflKja z{U-U~Z*5{mJ9-QYP^-p;;RVNmdZ6j~&a?!3wQ^=9YF1!B{uWbJTspCc3t2Bfp9J+B zfc1Vz#g9-4^c1pg%A=_5*Drq^x4p62GEm?U!3_xhYB!wG`w=7?o)Cj_=h-2XYGnY3 zp*%ys+G>VfUMNjt?0d-Yi6kh{Sl#flbeyIw~ZifZu^ia8exHS3kZ7< zb|bzk>Og?_tVr8UDdwOzA;a`{?6{#Qz;+tyTt8cYdyWH(iLGZ*V~+}^zcBA&b$V>8 ztIcm(%xA*Cy1sm11&Fed7``^(KxhcgUbq@BJH=9#f{xFjrsf>QRRSgT3yC5g_hAVk zT{dVAM@t;lnpK~}{vT!M6e9}It=YD1+qUiQ(>QJ0wr$(CZQHhO+rDQeb0;&&|8gJe zxsuAxUiE!zvDtKTfZW8(obz=?oHw^?8d5`Aaa>rR;-z{5_wES(hr`DbUcXLsZY>tF zRJ=OjhWugtWn!Ij4FqK(g)*mNa-cfnfq> z_g-74N@0i@i4zxkym|E+1L%VNb5SpIoUH;aHX(^EV%u=ZV5wM=FB;3o)X3`XjeHs#Dq=3~85COzfvj4&4|!d0Tw>wJm~gc; zt34D*#PmfS%HrQmhQ!L>-9M?t!Sh)sCH09ZO-v@T-Atsm`u_8UbW z%;bCJ!kS#ht!Df78cWUx!Eb722)`P%UCoNc?56XJ#+RxTpiO*=4V#RrPNNucjOrp# z2EiO7PvA}a2rvKHO_<>qCJTMAzXs74maLjhPQA{0*{oL&H@#PCCi~m29E|6C!8%2Ekk&& zkFH)-wOgLgaIeMqu2*YCJ4}AUMId~^Lsk(P{+7X|)xThvwJ1VPt`3GdU*77pf;1=9 z&a_ob?f}pGct%48pl6e>Hj3gZ;8TPk;X4Yh`tiGZi0ZdRI7I;&%XANM-6(tgI+QrEcs; zkBjHo=g(bd$y!=@MX`hQ>|1zduq~rC{FFkD-PAalZC1DV!^6&x@6MRq=04S81q>C7 z(fTlQ7gAcAeG)3kVTqQeP7Bel82cSN`>%|@J;q@?LkRMzJ$pL|orxsd+Nlo$Jfx*6 z4sVGlu4ca$lA@!?B@y`1%tJv<#D%OuQ!zV-eQM;L2UuYyGA`ggN}k7zN;gE>9saP0E*7UQ1$=VsR|` zAfCiz%hvCmUfegfhoe&unZ7ejEai=6$CFm36+uDdyNPN`CXt?B4sL{fy!IKLx$QaQ z{dpq7A4N8r9-QmJj$}$}*=NMbM*(aQ=dBgeSu~1e=_F?M1aVl!zs<5kHKaHKhsBCG zhznK2h#GQgkSIAHY~w;GF62t-d3QvTtDmIn_x0N)azkyPc9?MwUB zn7xrTKkZs1y||fQ^{WR`(Z_w2<*H04dSLNK8XVDgiY*8iwyjG<^!S|Sk_y*4s$)|a z00~n3{cZe~#3;G63f_(bUvcA-BvG#@lU6y1rl(g2(`Q#BOUNRYb;IH(>{X1qv9VK< zqI%``mbP)zRr&e0??@^tG#m{W&%G~T8pwEtbgDPg(W|tIV9l3|$C0D9MLHeodS{~h zlTdiZP~(ybbSQ0u=uFS5_Z3WsmZKYK17tH3V^i;TVs1cRUPR;{;KmOn3vD^`#)9EC z+R6Ua;@W$G(3Q`Mx+UHdkgSsdj4!xqar_hP@D6|&)A*^Z(3F9zJt|l;wb5`vP8zAk z>A6-Ca*oJ)H+buL5BlSna3n(E>>BYm+bN_R9htY6BFIkwXlfgsQCxJUt~+FNIjo&f z+0EUk^cBo9n`c+Lj=9DN&O~=a(S=rjB_A9ROXV@X+Mpy{igrMcqatz7LNZi+W?Jr5 zQc_I}AYX#L=pOX8%4Dz+BXH>!mUr}iUP{!jO1^N#m%>FxI%H1_`Ugj04Iv&lrzXy8uyaZSuigC0$d!eLSWD zd{cr!!YDo6n-6g|A`qFSx*#8&;RL0-Hz_?usvnz!3#eFjFFDg~9lp9g13f>rejtP0 zVY(?JVE5YKYftMESUy_$AC$8f6m1Gk2J7gQ3Dox;Hy)ldZ!$bDr6+`ZK!&-4Jlovc zPhj)B)GLB&(opDjpRrz=O$N^gi_MM~q|)r_GH|OA+g}STbB=3{yU3S4rG>pS3sGzspZE_5f9heBww%qQN*I?r&A3u<)ndwq zBC9-GrFl0=I#U+DT5v%x%W#$3C)fw);2%U{EKue`&Bg6kdi?|@4kE83xEXk|PKa-q zvnu^Kg6^db^QG$#c|ZH71U}X;^FAW*gw4%PyFKN1MlXrJy?e4n6{553uJj@w{ov7#ydzaygQ#OeTu#e0CedmdP(c)iN9PR19BYMwOLAb zovk#U)%gbMH}q7mlcp9KdxKx$*k{H#Q(?pS34TxIqU_^((Uhg`Uj@_MHn04Ipzs-)>uFhPs{X=*?F0J+#Uz^CI ztJ}B9JRg9zn~9naL0F3CcWG#M+D)Rz48eXsGdlhS;WRW)|Ey&@NbqSz@tUBwaZ*xu zJTr~v={DU)kXH8^FALTv-8i?aBGWhI{_Aswiud|C=7rAzmDB_{r21$buv#X$$B#~D6rheA6Z%_Y6P-Bf)i zXs^U29ZyC@`SfXPmcBR&bC|D|49-gMPd@HAv$&hq*wra*Nt{eNGj+B$r;3Q3EaNbj5p)oIT5SUjefG@8+Qk zK@cs+&rLMu3gljy(x<>TGX9MkS@4yuZ9`6`bh2@e^A(s%Z{HZk-!3zg!fdh=m8B#8 zAFX@h6p$O|7^TE~Jm*Y4rWP?<`;485Cl}jG$H@VXwV_v)%PKUFe8){Bq*2yfFq~cj zDn|*XkKx-LTA-@OO_z<{!^PgrOG91VDOlQ7Gk;E?PgWC-SabvUPb6&DCm{SdC8j_p z%ooC1O3q6d)i_wcl+HZNnAjs7hL5dv=}foqoSe-|YXIZ9b&e_H7vh}60tVxr%9gZ^ zTN+W{$<1l$aMqM@N;y_JQ{WpUpgAl`*E8uGBC&2P%$oMtmx7V_u3b&7tMIrIbw8-` z!sp9uBB~zeR$U$?i$q$Qqn5KQPx%fH+;x;wZ0~5gRn9y6+u0N=H_Y5PR7E$7B*8_} zq_Nccb37uzn~RI56>8C2T?bITJ!7{;lF13dOr9@3bJ~_!hCkTX?Rik^KUC>cWR%XV z1;$~itEqtbWbg=qJJ86G)t5xJ-ssbkrTB}=DW-5S7bH4y_B~{Z*b^=38z>}Oz+B;< zCPnwMX0lJHE2k~Em)uPxr08jdvXG|W!&X)oiT7@5)6V-#|DGa6**^O=OSwF=eN0IAc4s5qL z(%3GC==sizOPo7f;qkS6QeSHmZ@h38CQ^%rNR0Y4fs-^w`+4?1ib|MKp^8kfGAh#I zw&1u#Z0K%6+=%cp>3wNTy>9I(i=NY0Z`ExGEIc^`;-2#Q?2Oy0Vk#4w&SZ?0S4q3= zoU#F#I4+m}0i4y3)%+bJt?w=j_x?Y|s-LL9SvpAluT%Gk=ZsZ7toN|l^KL)oxyh5O zCZZ0Dtq_lu_AFbyboJZ{`BFkEssBt_hM;$Y+g6YAk9@dOuVSx*O(w|ZMA_kPhB_n4 zxLfnAmw8yT0%lSid|x51(`a2gn_v}0nWPs;ubu*42rnYUdz@||+E!>ty42oSXgyLU z8Si0&v6MpptnQY*o>+!nN|Z7gjXUk!?pyrOWiq zGtXgxz9MrzOmb(UdY8{3r9e3_b=Xl+QCN=Ru+^AAyLXH0N~a4;&(rGvefTIm2?*mF zSg{9ukC*Tx5sDyqB&40z-vEi2=2%VW!++;FE=-E*}@hb1EW72YJ#KD5N9RE}|)qEVK!HlE=jNS&RAOhQD+g@m(GcI8}a14q2;$r>VQP$Kt{?KIw9E#!oite165V41C)hED-ZAXo%X%+JLh3Tcqgsa;Nj_Fg zY6z21ZK^w%YV#8=xm6{WN4>|gez)HD%Dv|I1{fT#>02lJ<}b93R<^bEMdl_}5M>Vi z<{Av!DylA{5#99CBjkb)EvfNJr-DZrOQHtP9jQ~TJ((tf$IxB7zLZa8Veo$53veV| zM^-_TdQnw5_q5=x#uG$*SEUE{YbS>EO`X-&y!~f*{a+(Vh;}0YA~aJk#rPqKM&>HvbEgfiCjGGXSD=;T9zk*^o}(KD%ZNa=TN;`ooa#T$^Kv8kqvWwp8WFDR z+&qJwbwv_It~7zVpVA`kBPD5Vg*^u zUXSskszfAsa@(sM5kup`gm`Vi>s|Xq68E?dqlFy<(2=Lo{za19orziob={c2 z4?|JNZ({o|NIPEU>Qs@49-4>alsn@?Sl7cbhA3k$c?0#ZG*l18nbpLKd)KFVh^YjO z@D;4-i=P}~@6O!LsaFONsXg$|8k@8#XX$pE?hY<(ClqoYtY;}qz={zggr%{SH#%LpX3tP}+VZKLq4Cs! zI^Ia$gaoSMex%c`&GZ-CAIyoNE#qOm#ES?Xy0Aws=^su-c~w_jJDQ%WMwvPHCf%!q z@t>h}9#TNp)~$Nw<)6B}YMm6eGNHsE@W6?q(1y{m&*23e&#fBe=7Phc1=#tJ2^_`S zpo%a1DCxHt&$KkK)ZhBe!lL3IaKFz(Yf+{WgezE~AP?7>M31E$gwGwT^B0&Yhrq#i&g&_tkP;N(u zNl8hRE)Z%*5uz(4?nC)hh?_A%1c^_no*FsE^2#RyIO(EBxT!vyrND-mGe$f5^> zn7OwB^ceuu715|kp@9H}1qd+x0u^i-15zQ#aiHWugP7&VF|c5^GEJaf!nryP>`i=K zBKDci!UIf>NkD$Xfm0Cb-Pn0TAmu^#bMzy$MZ6%O`!P=7!42yD#s|plKnB_;qaxlv zJOBwHm=R2D%g5_N?17GQ07mJVrFD|SK)tat2*3yUeW$}njKDJ32NeFUMa#os(1&ru z_%XNjUF%D*&as&WAN+AfI~QpMg$Uwo6{8tgT@Mu40RLQqeI}v*>gQb@XJUb1PH*s zyLB`3bZw&sgB2P4Ct#&`poX=XtdJ;Ug7WtxWHf8g{Vwm@)_-YhHWdBYs$xbu4u1Of zwDTj*hwBaT^Jt4mBigsYV~|PiMaT-j;%5`b03!fQh)+UE1?t-ZV6gQhkJmkysjI2m zmA#{9wgK|hRZXJq17ru8!oL9+{EmAsAk1L^7}*9sx&7?L{pE@G?+2jR!UL`gn>{vQNE*dj(VTx7z{+7U<>s_34N$L`MmB>i+@%`ScN0YNCO;QHT0Tf7|Wp zbd}!$(ABs1tBY!5iK!`I0-!XP^!w#+#Q4YWIsv}Pm5|T+e#P!|)qiwxes4pTc(k;9I^TUhf8p6d z0A2fkK=(K<{rm5A(SsEMAA0jo>i9F3g9Z2T!hT;Y3j-lfob4zlnRhLp!-;O?u7!sDEl7ZDj`ab{ISx)+v*^weAKh_D*h-rD${p zsD(u$C#wzf~zO;4-O zSpTHc0s!58rG*d&gCZ9uEp`Os8~58=VlLY1%OHDBZ&OVViYz{TbNZn0yd2p$vOL0H znO3en{k*^LRNd4l)qewBx1uH(=Q~Y3@oC_20z>jn!Q88BIGge0bRvyT&?g>pq(>s; z^FV`yRX{ROUskWVP7#3Qr9JQaA@O`k1$2t#3`}2#9z#t(+y{o0qlfa1V`CGq(?vcZ z+MX^5(_GI+c6r?{o@?SB)B<26Z`x|c7ezCv_hBwmwe@(vQbODDO7&0TTo<%&6`1>V z9fS`~<&4e~&G(T%#D-XaKZSeoXgm*8aD_=UH?Cw^rHIE))4{uApKgWWsJJn8>p-{> zSF$sv+)k9%7_Z!RyNA$^KZns3ua}Y7qTXwJbCzeLroqn_OUG1LK3&%95bP0eGXT%Z zaRK6M)AIcd$6Mi8>4r#8BAV&2rp&)%TG!BImzk|-y5Q7!7(V#mRlm54PeDf_bQjK; zd~n@mSucK2s9*{?Z)GiMW`nL{kEF7ljIY`~d2zIb9@wGTkz7U5`xJq|V~vTX{Nr*{ zFfpXWyB)#wlE>je8AhMTFVvGnQy%VSAeu~nB@NWI3$N&^=v z++{hw$<)y;Ep*0kw*TCM6h?Vj4GN2weQliiLiv8V?~O2@>#yzPAkFRON{DCl&4Gb!iFl*{BQwO(O5qi9Tb+%n`Ie@2A;HQcc@ zGLnj9Sh3~x?5I#(7#upggS2mCKzpYsnv^y7 zIHxyC0Taul{x=!*8&!$o+Xjf%xvKJkeQa)_l+=9CBnJMN(Iv5No-Z|yYx}# z!0RC^fMZd!5&05$L=+Zw%e|GoKfn}`o#t|jz_GG-S)V&LfpcPRMPDaVo8;+7b{Uy# zp8V5{@CtmGWg~()c4!6bOso(E*OaSQy4>uBU_K4Cm}6GH*b?U;Js0j1tZ6c~h! zVt?$6$`YyFgtI?$@tv~TO`k)}_ zGGYpUlP2-|TWaJ@azNr&HGJM(7v{hRxiA_5g z$JwCG`MStY6@x?~KgsYvic&mAb<1lchXr>gPK=1(efscjYtw(7uK~2`qb$MlGLf{` zE|tzORtmRUoUTti0GvI69#@aCsUc}aR$Byf5 zDamKv=al!waoJilE*Ue}_Gm%`BWnUfOp%Wmi`8ds`6fY+ynQP%&Fzg$vDDjWe;8Md zP6*9S0R*`~SBY5g`K@j+Z2mtkaE0CTg4kWmFD-gF3%Y^eAq zaZmrNUACP(fyQhll`ERAS!Xcj$ z?4R3M1^$p%@X1Hfe^Q;;Sl*H1F?YY#A--E&wJfUMue|cH;WkaWO<(Ha3OPZoL%z`M zoyb&cv$o!Q&&uCcLAhlBWuSw7b5hFtEOy~099@)ji1V~ZbOfEL^@#wV>U(~?#}IB( zZ@kO=;hhnKQKB{B-*TA`nfbz|zF2AsbM-w&KaPk1z}~p4uStSNX^Y7YfTLfz+A=iTdv}7ovPT zW!GE?NU)|lTgNkLJ7Q(<`mWN!O4>NF8*p=Nl9dNd)4Fe9UMbTNu%g6K&g;04>$Zu0 z)VMHRYCu;!7V>7@LE4+?Rr4pQ*OTzc>+AfSu!jS-b$2e!V~%iz!m5SjHI+LD6!0K& zuYkk~N*^AVs+Wp6GRG!J>;jZ%JqWI73n$c;z-=jP;jXrjronXU+SCGt+0S1tkZtPSOWy_&3cx`2qC;LEQwLw*-T(jVgds z?svV0CvdFyOjl-~!XNE`X+HPae&L##`H4Oj$H9d-&#;|yf60HUo%{yjL<4EP z8}vKm1nr+@1&hEgvcD#sg_cqu-aSQ62+12kcIjX@E00fc*D+~QOP)302b?Y;E;-l8 zIh9Cqld2qZT@7ug_-WScI(Jc{%jaf_1HA@wnez^<3XHW{Av9Fr*!Mj#y-36#n+O_~ zcc}{>oA}o)JHc3!HjTio+kWH~gopRiVq*WG(cjTUS?oC3-I#eesB|ZWGcB($aQ8c7q8hn zf7Y3ld}&{zCl?9}=0ZQX_ueA`7nTH(<3PnT{(@ReI@b5{h_0(QE7xduUEjMj37z0_ zG8-`FX#fOp^Osx8+I7@0(^5}NQ*0q|P;&qrf{x3woSy|fh(1j}5Rd)a4oboEco|?b zRq4n%nhZ3%X;ocaDJ~4m41UkUj*jhNK~A$ZBl{(2qe*~$6}>u}DT_d!)|xtkIMCT# z9~lC#(^A-js(ga}Y@CQO=s_{%6^;q8RG1UMXGc$|7j4{b6`;q`?WpLYQY)e;FmT{q zB`w6ZSeU$dqR08H-aA!<9B&q&c&nYi?ccb_@Clft!Y%@EX}ODt44yC|wy!V-J` zCDfSuk2UY0m%EDg>#-Ym;8<-j0K3l94@a50ZzqalIqj5bZYV@Q3a@IeMXR>b+eNuv z?PH_-sW-=mx5vkt_|S8k$rC(Po_uB2ZSz<;3Rp-nnaN4(LrJ0$6Q%#@sqTAW)6&KF zdDKEeHhBY)hM%k>9aeB`=1?fy)7IKwrzcoG4g3#%HkXE7F7IWN_;q>;Y8s_JK7VDE zHHG$ltO05lNnyytcH>jY>3A_35k;JYqkpy4K?BXCrp=+$#Xs=EvsENS9DJk-Ed118 z8RRc6%$wXE*=!RBT~D4pi6xaHPVi8Q)MISAR9l;Puv|EouSB!=e{v33^2XSprYM-% z?`z>aij%p{jzE=hKw^3x}tX36IZ%4F~Y>Y zc5h!`Jopf}U115$nY&!|_48t;vUiDS=FG7%z7#S;2|jbasMdp`Tyz}``oeQ7{5r4t z$x{Wf8!RI!L4P)|#h&VP#!vq4bgSIUJ?f-N#&-rbUSTU9_YmI?7B5E<1w@$ zs#{J_({lNek*t04L}_w7Eq|%*c7&$BG*i_V5T~i%W7o>*5fx{K&!L8(F>W?j?@4u} z=Xuf!m1;6w5Ct`%cQV*ao@UZ*bBWOOq>BJ+=zN{RWF*B7pVe~G+8}1}j-OAe8$iDi z00d=vZS)6qj1^R^RYa~oM16bq2Lr<{Ehd{~I14SHmuz$hZzp4MG4oexev`JCO0LG) zuQCUE9e%^-;BX@|ZmE{aR@{+V-NSl(J^9--2jNIWSk8q2JD5Z~O%7~P%G;cV6bl#Om zc@t5<1ao_oZ}1&=OQ4=>Bsa(qOC8C-@+?+Bx#Zd;9I4ctqFOC*QpH@hYl@G^;0U9i z+J!9~t+pPA1>v8r*IMp~!>7F7m(a(-#4&vhmub>3VN(FZfM)5}kS-GQ3vJg^7Licn zMq%CoB^KZD#n_3ZB9Go+RCBH^^MpyI4Ka#6!6-o4xUC+I1L57ENE5R!lWLajd?LK!s_xUv?H_V{@>iBeYlBT|O6az_ z>rbaWDn_)cEx{=w>tspIMww-}+WHs1wr<#Tb9uE&qmdLoWWLOP;RKR5lb5z7dx4uQ zgueO6>9R1615tggyeyV7=c`}8aoWrrZmf2~_1PNauugN(5lX#PCKpGTP)YH;p^Uya zvT9WH3sT?@E!US{7_uYG^tyLU6?IodZcGrih-~Zs#4RN*o-5(|E$c~ zy<}S^Dv>?+gQLG>irBEqMCs!+1~UQQ^av}^@?O@nWnjwD0Zb9y^XHK&kT8!B17`#3 zHA>YXvKs*L%VR7Ytq2{Apqpi>;Kk0K0Dj@b$bBvyX?z?~t)2#Nrb3848U_U2c=f|+ za|$mdj<_`r<$Yq~J@TAbKQRBf4Wgw-vLX{E16$SWxkJ1st-cra&pf%t&3H@kpOepx2(@cz;!x!xX#@c@+T<_e510#`IIaklSbGczzEh%Q}S=`04N?wIrx zFzhri-UeWJ{fOpoCfz-OqdvV>#HxW9JuQEZ1p~kzaD$Juq(FKBO*jb{lr0p=G-yv* zXIs19b)e-6275`%nBih{{7Pb{yOyV8{E`Y2L(-uFmJ;cg%Jg<`CEF1*hhnPDAsc-;S zQe_Ss+51Y488tnS{#6jx60GtkJ4syhA5@o`l$vf=p4Er?(LK*znrgzRq(qKr>=YQ7 z{wBE;kq70+l8JFE7SLHkTgE$I@$?QvWbz4qY8tPH%2|~#x<*KmWsg^?y~QjESA*O| z1ND+R+M@oc_}zGSD@HZZl$k*hhOl1K^3Yb`A+EcDQ|ju+39A}53s&Y=nTqCHq%)FK z^zmSlV^KuOpUdRt3Esc+;6zCv9;tkF?47XZMJ5|6O*qf!^{x1AMqoB%wdms)V4Yic zb)Y&ml>KZl3ElUczQ;8at`DEx&JL{RLw*IV#wBJ>D#Wo?KdyxQSvI6UDt;6l5G#Od z4RB*C2yJ(Bz@g^}oRD&=%Q3Wk&>?7)bCKUVo%eaAJtWQMA(WN|I1HWr#4AoZ#@{%$#SC|{%1l^^Y4XyT)FN+vUjOmhoG$zx{yZ)E zS)KxZT&^juvbOjqJ;1zboxPw;*-m4AMQI)r#J1Jy=S6)mg@QYN=shiJd{eO;@?rl1gT)++<=Ec8u1k zkEo!lKEX=ws=sKv4NawCkZOG*xSvPhC*FP#+4i1aC%dU_7-ZE~IYsp5&msHN(O!yo zlG%>2Y4B(=QYEOkif7IkPPV*Nxb%#^}GAX(EZ+BjaUDTb?5UJYqy6~_9pThSXKMfJ#W>pqzn>FvPGNt!omMJzaX|2aTyK3tNK5BEtIy+Y$(-3;sT^DjUvhyfV z7voXjkGzBH_!uQ2YRdEow>Uk~VcSCUwOO;18};WZqbPmwg4|@N9;w(qNFTIoVZ5~; z^HN&qn)|Q^NJwhH^bL+_(2ctt*+W_F6g+70r1%{=7RnO&7zZEotnfKI?z4-rGHPAQ zU~tbbZrrB6lKi-xUVPM2DC^--|K5w&d~4ehE9Wh<)|JaeMoPFVv zTJ7;+Iqk$@I#fl`q^Y~U%c@>;=R)U78)s>&nr6DWU6IiVtFXu%=*O%VCDC+mSuA__ zQMR^pj)30J~jgbCS`WkV@ktBC*y=OE|tJE*EU)%p(&1r`Y9Gf;UpF4ICs}d-n z_`UxdC<$PM23Uy!03aZt4av*2ncjrlBpTI zV7kXzRRHuLY=DF~gw9`X9D-XI(E$QI4gu(>hET3TYN0+^0ALUhFj4nkV$jqk-hWv> zNDvPXkB7kQ?KeaTZuOf_06B~aygYd4KqB5eHa}fp;HLhWIsU|ZWP1RZYkeEvD=-Mn zBytQ$&^%aK1_+d!kQlqrO@Vj-Cwo8t4l;pJP^e$vl`r5n__t1MfH3^0|3ljP|4Atc z5rP{3&A_mMn}AmOvVZ+zBFOkBpq=pnLN>pE0D5D^ekQc}YKa0V6VCV1)7J%{bq z&g;$2(=~Yl`RSp9K=-5dfGFdiLW}qzesBi%6ab_s;$GT)_2vF?Cj#;ZU}J!Q(t~Xd z><|A*#I+9D_~9(1$A^3bN`ua82M2=q`uP65X3WrGgJ?^9_1){eMK7bQy&qExe4QQo zeW9cv=mO~RB0vPl4T69GKoa2}8Uh9U`IRn&4*9kg-s7*ou+sz)IFM^SWBsl)jO_*4 z`=Exi>Em}aC!VVc25S2ec7O&%1cdki{P->TxQ+Y89`rSS_l^JR#a6I)b@;eG`MCb& z-_kQpOMKM@_?I1`XaZmEYwwS4Cv4AfM8#%wT0%A64>kYGV>P1ncszHXQB7)%rkrc zYOGhl?PKF%*a>r$d&yo-$vm6~r}Aa#m7jA37I4p4f~$H=|>XuikT$1*F7o zbfUD_!TDSDRd#);i;nhN2H?i^f(&c0;oV*x(mlClqh6okoH6g+rz3~_gTorZEBsZ* z+N>SbnUYq(S%9FXMpl$jWgPESBi2O7zeJj>gEzvt&rRbXg-wDS2< zeg-_(dHAYbU0S#c8xM=;<}*XB@kRd-QJj~1v8*+GBy^mWBQvv9Y%_46ip-$wl96xa z&$`C!WevK};R7==){nL>LURB^rQ>`Y>C2}{N@Qf0I|Y8>t>E>A4Kha1KA=ULZLdYUu|t^#WB+EAw&yktp6 zUHWg(T4zt51wW@WfuwR_uI(ABbi)%#4Vox|EoK~(_;?gF&aHLTzKmL;MLf+?P@JLM za^PlE$#g03Zt0A|;HlmL#r5`?Zm`LYe!Ia7yKj5RPhKdLk=^*@k{XD)6+1ZAy|PMHS(Nt&^hFIfliHoUO~ykJ4`NS80e~Rz3rWQx zDo|sSj`X%v>TQ?dM=GCiw|>w`U^Zs0`Bh~1Dg>aB#}&AuVT9hkzlSkOIjd#t+bo-) z&3UoNylHCZ2g(J;UJfu!dSf|v9eq{w#FcAdZyc3>{^UrIowd6+U^J@SLi3CHEAdVYxR8!N& zwYwa@WY?D|GZAGKnw8;=2~(B9rH`&sx%xaty2s7HbXu?r5a~P}z9yu|GI~%lc>z-0 zb+tl>m?D~?`+ZUcF^odM4cniW_5R{HgMRO1NQkQo$r`O+|U zIYq)3|7tLV_=I`wNMxRl=*^3Ka$L)+xRTt=yPOMj&!F2H#Q}55-x26+58Hq5=Vg-H zndy?q*F*mdB|Ssuv~H(yhAvL{wP3mL)Z>3t0)L1ruaEJrSrgE^3%JMuEIH6IZ4{+bLV`{M+og$CsREZ2^6`UUF2kgeZc+#Vo@c3VJnmvdU8QWg%;DhFwMrvP-|^=Fj)U)+`j@E!1L%AA~YH#s%&66@tbge``PQ9D_a60;)KN{Cl zFO+w1kn-S7bJhbC^0Z!Eaj6TeUoPadt;PNbI(B0=neHap@L#V_^J$KXW;5?pfw*>W z=8!?`TG?Lg>SMFVBPjQfcaJA@Eni6Yjd!Eh&P%ZA?MV_(k+Gp}T#L(yT(`1313P{UH3 z`7!#u)P&ok>sl_gjyyQ5Jo;@kVM-ZLo=$x3jBKAB4^HY@sQ#(W&#z2H>iH_Pjj)`v7PfVJfYn=-un`W?PgV*P^vcbjh;5cz$rheZBc&T4vRXB!r^D-_#utH6DjV&Q%e}Dr z`Ew`rPTi5NnW>Caj(?Gmwjdt46Jyl{C%MhhhY=0WlvSKhV?Q|(UnkziWX#77w5$CA zSP~E~<5W+sMZRd@h#;t)dHcW++X$&M3)MTyAfefG~NEM~B4wg4<*R=2T zl|I5nxul)9FHP&pIvX93O-C3!=Qk1dqA7*9%9_YmHlMz>m_1cw6j+ zP=OL%EV7|4f?~QC62cm&XF5jqiau<&GgMz1na&)gP35Rm63;|K4Q^EUoNXzVZ za*G;Aj1hqNDl`ASB_@#f-l}^dr;W=L>~k%B>RT9MlZj*uU^>o3QFsDB*wHuzo*rry zjD4N`jS;-BG^89_1L`cEYsXd--?o6w@?q2l-C{AQL7w}=ud3wd^UCXBqb`GlC zR`fH}pJ2!v@L42GcSY58YG}&ft??M2h6xab9763@=kZ6{fs~|+k=LCV$je%p9Fzm6 zo+vi`8v5D87w>b6Ya2&@iQfKJJSX;~ zh$uCSN74_oe~=k3z_scP{kcFFRF&-+)yw2)TBk=8Zfcd#JjmN}SIMn;xhC-ymE^O<5hs7Ro73`tj@k7hC5LqzThD>uKAzZQHhO+qUg#+qP}nc)EMqwvGRd6LEIm zsx}o-%eyKwD=)Tqox1<#?ha(#5yJ76zrD4`_qH6;Gn05LC8=DiQYfs3cHfDskMMVI z+oNuv)4THoPK+XV$q%0Sdk(_7O@fqFG@bvD#U*Irk!_B|KO9u0Ej0zMKFxuYi@M-= z6Zp@$CBOd~;cc8G+GWa2m_>t&k3PmYFj-{{hK?T_jv@2zqdi>?G{)!;Dx!j|0rwfc zJ0rTlex!IdZ*yl;l2)Q-c5y%#G{NA+TKh$CvK(3^@y|k0G}1K^MY}sae+z}ELyi>r zYIRV6%hj_y6&zqJj2{y3^;s^(rY^7TpctWzKjq3t)|vXMy=&x6nlPEa{l9HsCw0LQ z_G92_aKGQnJIio2Q#XnEWRi+_iq(1Iz}hA^Mw296yfHx77G~IQ4SyL6leWfRg|5A3 zPswmty$9eODrC+yQEw>+Y{`X4OD}Xk{A5;8XzQOq1bdc+0^rfpe*AX<>$9e&l@n zfAM4p>RtZ^bZ<9>7yt#WD2K-*(5SeS9>aXb&y}8Jw0w;K6*{jCF+6{%L1@r@TzCV;x_z#!o-o;qwSk!3Cfe3ZCx3;cpGC}~k3G;>Ds_EiLPI@7Cr zV86b9CStP5+En@w&ln)c3#`Q}-^3?HwoKXR?b>Dk20!1&0F?##T^d{4dnq#wkd)1( zDnRj%n5NORYBQ;!wS4)V<*sSqrWJgwldEf(9$yR}zjM>qKZs?y42YE=L2u#a?vh6P zAMx)nn`9UNu#T{KMKIuVuoUVXPm`@n**Q`0X}S_s^y)#f?5Z=db9@x=47h*QDFf)6StV@faZ7N@q1`2)w*HEm!@mhIg-_y zING)pAB6K(0%ix7*FMmsQIA~bkJ!B4JRf&8s1GbQp)5lZF5l3BBKmxu0vu;1+X5u z%GdaDVc6DCUtEFlwMo(O)-fNGf4|&;U^u|z64bmo|0SRUio&5M^LM1OjvDAHJ}APq zQgIkCdY6wr)fnlni-wL%fFcD8N#tQi)Cm>p^!#2)>2 z144+Wf?b_?Vc5sk(ovRIiy>HID%^;$|E@DmGM|JX$zy0UnMVzitv5YM zW$S~8pJO%tKAL<%-X#xio_|Ht*^>`0f@&>76yZGtwvH_O095^9Rwp-!Jt$v6B)fou zpH`&u<5z-7D!j-UoYM|9paMyO25>IrGt~`&LO>+h1ECcr?K7%xsq_r`&3;hMf+BFB zVBmNz6ve$rA7{_6I#F3|y<_{A4=4;6#4|4jh@wnba1h!eApm1e=s;@MrYNQE`g!&d zTJIv``Du9@7KplgS4BhmY+J{pq|dmdAW1^3_ftwr!m8D+M>1xf(?FDGAqac{HkW2I z$tt7MSC{H^5;}ZP-c8sx0dn$y9z@;Wjc>zxMVXn8Xv0foN8fplt9{lWJQ6&%$qegh zO^CRhG|Ru_OyfrLBPo!@iFVXvnfEcm>dG^Z>d$>1{&*oq*QTp{C`QoN{umKStpePP zj|Pc+6m~pRZ*Rz5rA*EG!!p^Oat!Dg2PuYW#ca+w0%}C$4BN(Ux*Wr$tRylvch@A} zCrc^rUxZt^lwVdmT}LBhnhVy>Di{j6r+c4?{I@zFc_?ijPSDd3Bpn!1UvT@C1Wg-k za%tVJAWS%N`6d=o&Ee3T0zX3-aKk5MVdB`3W5m$QHnO=pCEeMd|Bwfq8Z2{?=%qfA zu*mH6<71NA9s^e%BfIr_=-&P$EwYN>i*l}xjP_QK*-SSp%!3hQ@$O>s>EP|cSN{b{<2=j zHg!J-!J`|_?n+7xU6+joB?Ztzi;rT_A;Z8+v9{CaLkx~!?%YH-L_#Q)lAx(?CeN0Y z_R`Q?vXdlJnI_j?L;MNyK}cBhy2%H+rlEGlTf_F#$YTse=Afd=^VC+_T+Z_aPwRpd zS`ECwdbsuOFoLL!_XzOy7yZKgl!BrNz6q?}RjLp|N8mkCC5XwMYI^k3Jh7S($pJ6& z+RIxAp?+uZN7Jn8aS4ZJ%Fg_-fj}uN5#~OOc$kLH&()6bTi?#PQG~}2o*Vr$9TMM5 z0;?XikZQyqoekOxd2Ni=`&3Z>lyNS~@S+TV;At3l&78feS;#_tz{7jYr3!<~tW6d> zr-?Ls5(dJR&^S`HDl8n7UHs4UHnV_1I&g9|apZJrT9OvVD5dENw6)7H_suqpsPek~ z{!mixz-9E*BjVZs$%`5nW&6g{AvqlPi36p0%TbL~0)dHUqhqThm#SQ+;|4bF z138Utc7B~hwdZ4_vZuN7v_h2kRQwGMoNcxBsQ`S9J>PoY@e_m~xNP`iuOx@Zxp^-thN zy-A4`ONydO^?XD55zA91wY^=CF|j+A0L#-FM{TUIx==!&7jNq63ri;*zqfZnzR#gAg@l(j-ZFr6o^(}9X1?nko3TcZZeqx@&L+e{kt(6toN z=`i>r$LXJ=a1r@g!Hcf$aULxSIg@!`ay`5C8MW0;PLDy9p-T)O4tnKgDE@2G3$&Ma zFJ_*LS!}eC8PVqP4*`}emNi*NE3axyD@JAk$C0G!mW0a?dEe-$J4o@AF0w|;^s6b8 zcwZU0gs(7RdrDJ=SJ79Cb*V@mfC#M-G#ajBQCC<*d7~es&#?fMqunv32 zi+IPD&j+70LWiU4;j?M|q|zIJd(BimA>vY`x^(6Q#;PyuuhsZ`ACZkvr?Qam*7XLM zgI)O&`6Krz`f$Gr7Im&lfL<69y@!Lf z1`<>EnBwS%Qz{*qv=?V@CD|~^TDbC-sz^}+2jlL+7XE%#>;xOvo!NBdI||muSH|E1 zcz{}w7IfRmWD>tiqeq{a?Mh*A3hHZ=GAq(Sdr!bxmN1L0-ya>bC$HogZxlaAn)Q0H zQbC2@$k|jqSb=W&HTXHpbSEHgbfU-)0fB;?Zt8Pj8$C_Q=r!ii`F+?cM#s*tn$`C4 zK2;dB)Q99cx7uTOtrg4Tso}{aW0@)czwhJj=>RUXttXq=(XwK3Qm~LrU{WGiIhh+7TJJ#8>TPB8^3jMq zU}f`!Fc<^b$uODG(nCn52ex31$*fM`_aH5Tf`OzHumf}OhKGlTB4xmmf>(UFwY0Rk zKrPt$t!J2+n7`-mG+>4o_xVZf$@1#x?td=Y2{aHfjU8Z`T>L}c3vBp%2&vA8xhd45e`cnsR$$lB=QpB=;kYG`Hw z?hf=Lwm0hl|DK)LOL9av{6hBvUIy&s?9S}c(&Pc&qo$UW@&ln@A%k+-Z_T6C8wP~< z*e**rGILy?_7mSb*dvxJS96u~XO7V0zYUqee*|eLd>W$0b*?!WeI%;;tvWch09s$k zKqLc5rbY*lpdmRqJBB+AzgcqvpP*muH*#0kgZKgY;a|DW2Dmjjxq^l+=BDf~?OEn? z4y|-GSBY9b+NfGQE|7t7&jkJjG2a1Wx3sO+)2t+_G!6~7YDRto*|JN*VDqKkU~e`oC79VB~&%lqf1 zJ-El#mj73zwclvt$BHJ4lSjJ~mG|7AA@9=J1PCK2P5&>VPhtrE*>ZuJcyFh=_9-3>7G58c36 zuf#Zd*AVXdQXXD^pNh?|63)1!cr(!EHAlG4Z$Ccs2=BTdVAZ24Sk@&bfbPoUol(1B z#}CgHL?1R@X(6e#tZ&8&W7E{LSD(#|V_KaL7gM+!`A>?DkF;oa{Xwns`r%9oxLWj` z?OPk$Z!=jDF;Y7vz*nNU+5IUzC&2$=T5tneZcDq7$~ka$1zw3C6&+*WTRDd`Za9k?e~)9F9ESKhC12CvGuh^YdYYye zBKoRJ`f82{CDw1bJ10id8H@GXC}RW5IbH7q)djsctIGY4pmMJ&MepiCdeA9z*c71) zXGCY@rQGyNMQ%9DLqnbSAFNE6?-$-8bjT1KiE;(=#8&q7V7>$a804RQd!C;R3PaXF ztbzUTEbUZD8M!toIWId0n}wHveXhT)T;4eIVt1!`=7AtIy>#SD9$(qOC z)nJ2j23$q$I~ul;+^D&XH;-_8e!udoYiM6NX`mLG`F-U(#~6?<^pCu=XlEqstYuB_ z`dgIhG6<4-L%~9^@-kjNbPVm#Ct~PjenMY<{CLfP5hAu#m5P6r(UktK zP$W3KX+kEbSvzDIzgw}^yhJKkFcY4nhUA~#!cqm$06~^*RGo7d7ekoUEfy&94gmWt zw;$?sdIjTe-NZxj-?BB7fIlWGJs3VILzf}t=^t!`U7#3lBA;N{vAY#g&=mV@G0)-R zHhitXCp^ApQCdF1hgc=Y#gF?Sa3%4hu51F|pi=A)gbFJA1p40y1g zL8ZZZ;dfVM)ig6fYkWFc{tHHNrNT%F9S4F{o0DRhv9fmQx0WAmYt1-o==*U0w2>#a z5-`G8cwdOjL9-hK=(@8-dm|mZ>TO7_$%*#Ni8$fdh*B8Kn;oSdV*uyyS8~PR0aiG5 z;fhM)+9m-hf_$w~-)^kY3KB;L)q&}GxP>0^+yhGE)l^SBh_7#-K>{*;xt3EYa2~{m zRkZd!-QUk5ksU{JrY3kd4&#Y2c|Q!HCf$ro1gH?H83LNwGQL*U>cj}M_=-VoYD&7P zGG)m#pDg>!!%BVqWJy9nE|BtAMu5lQv{4hWPWJbf#uOS|Xo4Bc&A`J7eOJ)k_S

b@{>x%$^ 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 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.c b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.c deleted file mode 100644 index 2898f668f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.c +++ /dev/null @@ -1,348 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - -#include -#include // for memset -#include "ec_code.h" -#include "ec_base.h" // for GF tables -#include "ec_types.h" - -unsigned char gf_mul(unsigned char a, unsigned char b) -{ -#ifndef GF_LARGE_TABLES - int i; - - if ((a == 0) || (b == 0)) - return 0; - - return gff_base[(i = gflog_base[a] + gflog_base[b]) > 254 ? i - 255 : i]; -#else - return gf_mul_table_base[b * 256 + a]; -#endif -} - -unsigned char gf_inv(unsigned char a) -{ -#ifndef GF_LARGE_TABLES - if (a == 0) - return 0; - - return gff_base[255 - gflog_base[a]]; -#else - return gf_inv_table_base[a]; -#endif -} - -void gf_gen_rs_matrix(unsigned char *a, int m, int k) -{ - int i, j; - unsigned char p, gen = 1; - - memset(a, 0, k * m); - for (i = 0; i < k; i++) - a[k * i + i] = 1; - - for (i = k; i < m; i++) { - p = 1; - for (j = 0; j < k; j++) { - a[k * i + j] = p; - p = gf_mul(p, gen); - } - gen = gf_mul(gen, 2); - } -} - -void gf_gen_cauchy1_matrix(unsigned char *a, int m, int k) -{ - int i, j; - unsigned char *p; - - // Identity matrix in high position - memset(a, 0, k * m); - for (i = 0; i < k; i++) - a[k * i + i] = 1; - - // For the rest choose 1/(i + j) | i != j - p = &a[k * k]; - for (i = k; i < m; i++) - for (j = 0; j < k; j++) - *p++ = gf_inv(i ^ j); - -} - -int gf_invert_matrix(unsigned char *in_mat, unsigned char *out_mat, const int n) -{ - int i, j, k; - unsigned char temp; - - // Set out_mat[] to the identity matrix - for (i = 0; i < n * n; i++) // memset(out_mat, 0, n*n) - out_mat[i] = 0; - - for (i = 0; i < n; i++) - out_mat[i * n + i] = 1; - - // Inverse - for (i = 0; i < n; i++) { - // Check for 0 in pivot element - if (in_mat[i * n + i] == 0) { - // Find a row with non-zero in current column and swap - for (j = i + 1; j < n; j++) - if (in_mat[j * n + i]) - break; - - if (j == n) // Couldn't find means it's singular - return -1; - - for (k = 0; k < n; k++) { // Swap rows i,j - temp = in_mat[i * n + k]; - in_mat[i * n + k] = in_mat[j * n + k]; - in_mat[j * n + k] = temp; - - temp = out_mat[i * n + k]; - out_mat[i * n + k] = out_mat[j * n + k]; - out_mat[j * n + k] = temp; - } - } - - temp = gf_inv(in_mat[i * n + i]); // 1/pivot - for (j = 0; j < n; j++) { // Scale row i by 1/pivot - in_mat[i * n + j] = gf_mul(in_mat[i * n + j], temp); - out_mat[i * n + j] = gf_mul(out_mat[i * n + j], temp); - } - - for (j = 0; j < n; j++) { - if (j == i) - continue; - - temp = in_mat[j * n + i]; - for (k = 0; k < n; k++) { - out_mat[j * n + k] ^= gf_mul(temp, out_mat[i * n + k]); - in_mat[j * n + k] ^= gf_mul(temp, in_mat[i * n + k]); - } - } - } - return 0; -} - -// Calculates const table gftbl in GF(2^8) from single input A -// gftbl(A) = {A{00}, A{01}, A{02}, ... , A{0f} }, {A{00}, A{10}, A{20}, ... , A{f0} } - -void gf_vect_mul_init(unsigned char c, unsigned char *tbl) -{ - unsigned char c2 = (c << 1) ^ ((c & 0x80) ? 0x1d : 0); //Mult by GF{2} - unsigned char c4 = (c2 << 1) ^ ((c2 & 0x80) ? 0x1d : 0); //Mult by GF{2} - unsigned char c8 = (c4 << 1) ^ ((c4 & 0x80) ? 0x1d : 0); //Mult by GF{2} - -#if __WORDSIZE == 64 || _WIN64 || __x86_64__ - unsigned long long v1, v2, v4, v8, *t; - unsigned long long v10, v20, v40, v80; - unsigned char c17, c18, c20, c24; - - t = (unsigned long long *)tbl; - - v1 = c * 0x0100010001000100ull; - v2 = c2 * 0x0101000001010000ull; - v4 = c4 * 0x0101010100000000ull; - v8 = c8 * 0x0101010101010101ull; - - v4 = v1 ^ v2 ^ v4; - t[0] = v4; - t[1] = v8 ^ v4; - - c17 = (c8 << 1) ^ ((c8 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c18 = (c17 << 1) ^ ((c17 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c20 = (c18 << 1) ^ ((c18 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c24 = (c20 << 1) ^ ((c20 & 0x80) ? 0x1d : 0); //Mult by GF{2} - - v10 = c17 * 0x0100010001000100ull; - v20 = c18 * 0x0101000001010000ull; - v40 = c20 * 0x0101010100000000ull; - v80 = c24 * 0x0101010101010101ull; - - v40 = v10 ^ v20 ^ v40; - t[2] = v40; - t[3] = v80 ^ v40; - -#else // 32-bit or other - unsigned char c3, c5, c6, c7, c9, c10, c11, c12, c13, c14, c15; - unsigned char c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, - c31; - - c3 = c2 ^ c; - c5 = c4 ^ c; - c6 = c4 ^ c2; - c7 = c4 ^ c3; - - c9 = c8 ^ c; - c10 = c8 ^ c2; - c11 = c8 ^ c3; - c12 = c8 ^ c4; - c13 = c8 ^ c5; - c14 = c8 ^ c6; - c15 = c8 ^ c7; - - tbl[0] = 0; - tbl[1] = c; - tbl[2] = c2; - tbl[3] = c3; - tbl[4] = c4; - tbl[5] = c5; - tbl[6] = c6; - tbl[7] = c7; - tbl[8] = c8; - tbl[9] = c9; - tbl[10] = c10; - tbl[11] = c11; - tbl[12] = c12; - tbl[13] = c13; - tbl[14] = c14; - tbl[15] = c15; - - c17 = (c8 << 1) ^ ((c8 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c18 = (c17 << 1) ^ ((c17 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c19 = c18 ^ c17; - c20 = (c18 << 1) ^ ((c18 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c21 = c20 ^ c17; - c22 = c20 ^ c18; - c23 = c20 ^ c19; - c24 = (c20 << 1) ^ ((c20 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c25 = c24 ^ c17; - c26 = c24 ^ c18; - c27 = c24 ^ c19; - c28 = c24 ^ c20; - c29 = c24 ^ c21; - c30 = c24 ^ c22; - c31 = c24 ^ c23; - - tbl[16] = 0; - tbl[17] = c17; - tbl[18] = c18; - tbl[19] = c19; - tbl[20] = c20; - tbl[21] = c21; - tbl[22] = c22; - tbl[23] = c23; - tbl[24] = c24; - tbl[25] = c25; - tbl[26] = c26; - tbl[27] = c27; - tbl[28] = c28; - tbl[29] = c29; - tbl[30] = c30; - tbl[31] = c31; - -#endif //__WORDSIZE == 64 || _WIN64 || __x86_64__ -} - -void gf_vect_dot_prod_base(int len, int vlen, unsigned char *v, - unsigned char **src, unsigned char *dest) -{ - int i, j; - unsigned char s; - for (i = 0; i < len; i++) { - s = 0; - for (j = 0; j < vlen; j++) - s ^= gf_mul(src[j][i], v[j * 32 + 1]); - - dest[i] = s; - } -} - -void gf_vect_mad_base(int len, int vec, int vec_i, - unsigned char *v, unsigned char *src, unsigned char *dest) -{ - int i; - unsigned char s; - for (i = 0; i < len; i++) { - s = dest[i]; - s ^= gf_mul(src[i], v[vec_i * 32 + 1]); - dest[i] = s; - } -} - -void ec_encode_data_base(int len, int srcs, int dests, unsigned char *v, - unsigned char **src, unsigned char **dest) -{ - int i, j, l; - unsigned char s; - - for (l = 0; l < dests; l++) { - for (i = 0; i < len; i++) { - s = 0; - for (j = 0; j < srcs; j++) - s ^= gf_mul(src[j][i], v[j * 32 + l * srcs * 32 + 1]); - - dest[l][i] = s; - } - } -} - -void ec_encode_data_update_base(int len, int k, int rows, int vec_i, unsigned char *v, - unsigned char *data, unsigned char **dest) -{ - int i, l; - unsigned char s; - - for (l = 0; l < rows; l++) { - for (i = 0; i < len; i++) { - s = dest[l][i]; - s ^= gf_mul(data[i], v[vec_i * 32 + l * k * 32 + 1]); - - dest[l][i] = s; - } - } -} - -void gf_vect_mul_base(int len, unsigned char *a, unsigned char *src, unsigned char *dest) -{ - //2nd element of table array is ref value used to fill it in - unsigned char c = a[1]; - while (len-- > 0) - *dest++ = gf_mul(c, *src++); -} - -struct slver { - UINT16 snum; - UINT8 ver; - UINT8 core; -}; - -// Version info -struct slver gf_vect_mul_init_slver_00020035; -struct slver gf_vect_mul_init_slver = { 0x0035, 0x02, 0x00 }; - -struct slver ec_encode_data_base_slver_00010135; -struct slver ec_encode_data_base_slver = { 0x0135, 0x01, 0x00 }; - -struct slver gf_vect_mul_base_slver_00010136; -struct slver gf_vect_mul_base_slver = { 0x0136, 0x01, 0x00 }; - -struct slver gf_vect_dot_prod_base_slver_00010137; -struct slver gf_vect_dot_prod_base_slver = { 0x0137, 0x01, 0x00 }; diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.h deleted file mode 100644 index db4fd9d6c..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_base.h +++ /dev/null @@ -1,6680 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - -#ifndef _EC_BASE_H_ -#define _EC_BASE_H_ - -// Global GF(256) tables -#ifndef GF_LARGE_TABLES -unsigned char gff_base[] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, - 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, - 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, - 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, - 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, - 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, - 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, - 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, - 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, - 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, - 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, - 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, - 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, - 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, - 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, - 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, - 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, - 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, - 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, - 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, - 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51, 0xa2, - 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, - 0xac, 0x45, 0x8a, 0x09, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, - 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, - 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, - 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01 -}; - -unsigned char gflog_base[] = { - 0x00, 0xff, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, - 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, 0x04, 0x64, 0xe0, 0x0e, - 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, - 0x4c, 0x71, 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, - 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, 0x1d, 0xb5, - 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, - 0x4d, 0xe4, 0x72, 0xa6, 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, - 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, - 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, - 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, 0x1e, 0x42, 0xb6, 0xa3, - 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, - 0xba, 0x3d, 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, - 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, 0x07, 0x70, - 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, - 0x31, 0xc5, 0xfe, 0x18, 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, - 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, - 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, - 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, 0xf2, 0x56, 0xd3, 0xab, - 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, - 0x41, 0xa2, 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, - 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, 0x6c, 0xa1, - 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, - 0xbb, 0xcc, 0x3e, 0x5a, 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, - 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, - 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, - 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf -}; -#else -unsigned char gf_mul_table_base[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, - 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, - 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, - 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, - 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, - 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, - 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, - 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, - 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, - 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, - 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, - 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, - 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, - 0xfe, 0xff, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, - 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, - 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, - 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, - 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, - 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, - 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, - 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0, 0xc2, - 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, - 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, - 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, - 0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0x0d, 0x0f, - 0x09, 0x0b, 0x05, 0x07, 0x01, 0x03, 0x3d, 0x3f, 0x39, 0x3b, - 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, - 0x21, 0x23, 0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, - 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43, 0x7d, 0x7f, - 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, - 0x65, 0x67, 0x61, 0x63, 0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, - 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83, - 0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, - 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3, 0xdd, 0xdf, 0xd9, 0xdb, - 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, - 0xc1, 0xc3, 0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, - 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3, 0x00, 0x03, - 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, - 0x14, 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, - 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, - 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, - 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, 0x50, 0x53, 0x56, 0x55, - 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, - 0x42, 0x41, 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, - 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, - 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, - 0xe4, 0xe7, 0xe2, 0xe1, 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, - 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, - 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, - 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9d, 0x9e, 0x9b, 0x98, - 0x91, 0x92, 0x97, 0x94, 0x85, 0x86, 0x83, 0x80, 0x89, 0x8a, - 0x8f, 0x8c, 0xad, 0xae, 0xab, 0xa8, 0xa1, 0xa2, 0xa7, 0xa4, - 0xb5, 0xb6, 0xb3, 0xb0, 0xb9, 0xba, 0xbf, 0xbc, 0xfd, 0xfe, - 0xfb, 0xf8, 0xf1, 0xf2, 0xf7, 0xf4, 0xe5, 0xe6, 0xe3, 0xe0, - 0xe9, 0xea, 0xef, 0xec, 0xcd, 0xce, 0xcb, 0xc8, 0xc1, 0xc2, - 0xc7, 0xc4, 0xd5, 0xd6, 0xd3, 0xd0, 0xd9, 0xda, 0xdf, 0xdc, - 0x5d, 0x5e, 0x5b, 0x58, 0x51, 0x52, 0x57, 0x54, 0x45, 0x46, - 0x43, 0x40, 0x49, 0x4a, 0x4f, 0x4c, 0x6d, 0x6e, 0x6b, 0x68, - 0x61, 0x62, 0x67, 0x64, 0x75, 0x76, 0x73, 0x70, 0x79, 0x7a, - 0x7f, 0x7c, 0x3d, 0x3e, 0x3b, 0x38, 0x31, 0x32, 0x37, 0x34, - 0x25, 0x26, 0x23, 0x20, 0x29, 0x2a, 0x2f, 0x2c, 0x0d, 0x0e, - 0x0b, 0x08, 0x01, 0x02, 0x07, 0x04, 0x15, 0x16, 0x13, 0x10, - 0x19, 0x1a, 0x1f, 0x1c, 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, - 0x18, 0x1c, 0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c, - 0x40, 0x44, 0x48, 0x4c, 0x50, 0x54, 0x58, 0x5c, 0x60, 0x64, - 0x68, 0x6c, 0x70, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, 0x8c, - 0x90, 0x94, 0x98, 0x9c, 0xa0, 0xa4, 0xa8, 0xac, 0xb0, 0xb4, - 0xb8, 0xbc, 0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4, 0xd8, 0xdc, - 0xe0, 0xe4, 0xe8, 0xec, 0xf0, 0xf4, 0xf8, 0xfc, 0x1d, 0x19, - 0x15, 0x11, 0x0d, 0x09, 0x05, 0x01, 0x3d, 0x39, 0x35, 0x31, - 0x2d, 0x29, 0x25, 0x21, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x49, - 0x45, 0x41, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61, - 0x9d, 0x99, 0x95, 0x91, 0x8d, 0x89, 0x85, 0x81, 0xbd, 0xb9, - 0xb5, 0xb1, 0xad, 0xa9, 0xa5, 0xa1, 0xdd, 0xd9, 0xd5, 0xd1, - 0xcd, 0xc9, 0xc5, 0xc1, 0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, - 0xe5, 0xe1, 0x3a, 0x3e, 0x32, 0x36, 0x2a, 0x2e, 0x22, 0x26, - 0x1a, 0x1e, 0x12, 0x16, 0x0a, 0x0e, 0x02, 0x06, 0x7a, 0x7e, - 0x72, 0x76, 0x6a, 0x6e, 0x62, 0x66, 0x5a, 0x5e, 0x52, 0x56, - 0x4a, 0x4e, 0x42, 0x46, 0xba, 0xbe, 0xb2, 0xb6, 0xaa, 0xae, - 0xa2, 0xa6, 0x9a, 0x9e, 0x92, 0x96, 0x8a, 0x8e, 0x82, 0x86, - 0xfa, 0xfe, 0xf2, 0xf6, 0xea, 0xee, 0xe2, 0xe6, 0xda, 0xde, - 0xd2, 0xd6, 0xca, 0xce, 0xc2, 0xc6, 0x27, 0x23, 0x2f, 0x2b, - 0x37, 0x33, 0x3f, 0x3b, 0x07, 0x03, 0x0f, 0x0b, 0x17, 0x13, - 0x1f, 0x1b, 0x67, 0x63, 0x6f, 0x6b, 0x77, 0x73, 0x7f, 0x7b, - 0x47, 0x43, 0x4f, 0x4b, 0x57, 0x53, 0x5f, 0x5b, 0xa7, 0xa3, - 0xaf, 0xab, 0xb7, 0xb3, 0xbf, 0xbb, 0x87, 0x83, 0x8f, 0x8b, - 0x97, 0x93, 0x9f, 0x9b, 0xe7, 0xe3, 0xef, 0xeb, 0xf7, 0xf3, - 0xff, 0xfb, 0xc7, 0xc3, 0xcf, 0xcb, 0xd7, 0xd3, 0xdf, 0xdb, - 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x11, 0x1e, 0x1b, 0x28, 0x2d, - 0x22, 0x27, 0x3c, 0x39, 0x36, 0x33, 0x50, 0x55, 0x5a, 0x5f, - 0x44, 0x41, 0x4e, 0x4b, 0x78, 0x7d, 0x72, 0x77, 0x6c, 0x69, - 0x66, 0x63, 0xa0, 0xa5, 0xaa, 0xaf, 0xb4, 0xb1, 0xbe, 0xbb, - 0x88, 0x8d, 0x82, 0x87, 0x9c, 0x99, 0x96, 0x93, 0xf0, 0xf5, - 0xfa, 0xff, 0xe4, 0xe1, 0xee, 0xeb, 0xd8, 0xdd, 0xd2, 0xd7, - 0xcc, 0xc9, 0xc6, 0xc3, 0x5d, 0x58, 0x57, 0x52, 0x49, 0x4c, - 0x43, 0x46, 0x75, 0x70, 0x7f, 0x7a, 0x61, 0x64, 0x6b, 0x6e, - 0x0d, 0x08, 0x07, 0x02, 0x19, 0x1c, 0x13, 0x16, 0x25, 0x20, - 0x2f, 0x2a, 0x31, 0x34, 0x3b, 0x3e, 0xfd, 0xf8, 0xf7, 0xf2, - 0xe9, 0xec, 0xe3, 0xe6, 0xd5, 0xd0, 0xdf, 0xda, 0xc1, 0xc4, - 0xcb, 0xce, 0xad, 0xa8, 0xa7, 0xa2, 0xb9, 0xbc, 0xb3, 0xb6, - 0x85, 0x80, 0x8f, 0x8a, 0x91, 0x94, 0x9b, 0x9e, 0xba, 0xbf, - 0xb0, 0xb5, 0xae, 0xab, 0xa4, 0xa1, 0x92, 0x97, 0x98, 0x9d, - 0x86, 0x83, 0x8c, 0x89, 0xea, 0xef, 0xe0, 0xe5, 0xfe, 0xfb, - 0xf4, 0xf1, 0xc2, 0xc7, 0xc8, 0xcd, 0xd6, 0xd3, 0xdc, 0xd9, - 0x1a, 0x1f, 0x10, 0x15, 0x0e, 0x0b, 0x04, 0x01, 0x32, 0x37, - 0x38, 0x3d, 0x26, 0x23, 0x2c, 0x29, 0x4a, 0x4f, 0x40, 0x45, - 0x5e, 0x5b, 0x54, 0x51, 0x62, 0x67, 0x68, 0x6d, 0x76, 0x73, - 0x7c, 0x79, 0xe7, 0xe2, 0xed, 0xe8, 0xf3, 0xf6, 0xf9, 0xfc, - 0xcf, 0xca, 0xc5, 0xc0, 0xdb, 0xde, 0xd1, 0xd4, 0xb7, 0xb2, - 0xbd, 0xb8, 0xa3, 0xa6, 0xa9, 0xac, 0x9f, 0x9a, 0x95, 0x90, - 0x8b, 0x8e, 0x81, 0x84, 0x47, 0x42, 0x4d, 0x48, 0x53, 0x56, - 0x59, 0x5c, 0x6f, 0x6a, 0x65, 0x60, 0x7b, 0x7e, 0x71, 0x74, - 0x17, 0x12, 0x1d, 0x18, 0x03, 0x06, 0x09, 0x0c, 0x3f, 0x3a, - 0x35, 0x30, 0x2b, 0x2e, 0x21, 0x24, 0x00, 0x06, 0x0c, 0x0a, - 0x18, 0x1e, 0x14, 0x12, 0x30, 0x36, 0x3c, 0x3a, 0x28, 0x2e, - 0x24, 0x22, 0x60, 0x66, 0x6c, 0x6a, 0x78, 0x7e, 0x74, 0x72, - 0x50, 0x56, 0x5c, 0x5a, 0x48, 0x4e, 0x44, 0x42, 0xc0, 0xc6, - 0xcc, 0xca, 0xd8, 0xde, 0xd4, 0xd2, 0xf0, 0xf6, 0xfc, 0xfa, - 0xe8, 0xee, 0xe4, 0xe2, 0xa0, 0xa6, 0xac, 0xaa, 0xb8, 0xbe, - 0xb4, 0xb2, 0x90, 0x96, 0x9c, 0x9a, 0x88, 0x8e, 0x84, 0x82, - 0x9d, 0x9b, 0x91, 0x97, 0x85, 0x83, 0x89, 0x8f, 0xad, 0xab, - 0xa1, 0xa7, 0xb5, 0xb3, 0xb9, 0xbf, 0xfd, 0xfb, 0xf1, 0xf7, - 0xe5, 0xe3, 0xe9, 0xef, 0xcd, 0xcb, 0xc1, 0xc7, 0xd5, 0xd3, - 0xd9, 0xdf, 0x5d, 0x5b, 0x51, 0x57, 0x45, 0x43, 0x49, 0x4f, - 0x6d, 0x6b, 0x61, 0x67, 0x75, 0x73, 0x79, 0x7f, 0x3d, 0x3b, - 0x31, 0x37, 0x25, 0x23, 0x29, 0x2f, 0x0d, 0x0b, 0x01, 0x07, - 0x15, 0x13, 0x19, 0x1f, 0x27, 0x21, 0x2b, 0x2d, 0x3f, 0x39, - 0x33, 0x35, 0x17, 0x11, 0x1b, 0x1d, 0x0f, 0x09, 0x03, 0x05, - 0x47, 0x41, 0x4b, 0x4d, 0x5f, 0x59, 0x53, 0x55, 0x77, 0x71, - 0x7b, 0x7d, 0x6f, 0x69, 0x63, 0x65, 0xe7, 0xe1, 0xeb, 0xed, - 0xff, 0xf9, 0xf3, 0xf5, 0xd7, 0xd1, 0xdb, 0xdd, 0xcf, 0xc9, - 0xc3, 0xc5, 0x87, 0x81, 0x8b, 0x8d, 0x9f, 0x99, 0x93, 0x95, - 0xb7, 0xb1, 0xbb, 0xbd, 0xaf, 0xa9, 0xa3, 0xa5, 0xba, 0xbc, - 0xb6, 0xb0, 0xa2, 0xa4, 0xae, 0xa8, 0x8a, 0x8c, 0x86, 0x80, - 0x92, 0x94, 0x9e, 0x98, 0xda, 0xdc, 0xd6, 0xd0, 0xc2, 0xc4, - 0xce, 0xc8, 0xea, 0xec, 0xe6, 0xe0, 0xf2, 0xf4, 0xfe, 0xf8, - 0x7a, 0x7c, 0x76, 0x70, 0x62, 0x64, 0x6e, 0x68, 0x4a, 0x4c, - 0x46, 0x40, 0x52, 0x54, 0x5e, 0x58, 0x1a, 0x1c, 0x16, 0x10, - 0x02, 0x04, 0x0e, 0x08, 0x2a, 0x2c, 0x26, 0x20, 0x32, 0x34, - 0x3e, 0x38, 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, - 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, - 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, - 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, - 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, - 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, - 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xdd, 0xda, 0xd3, 0xd4, - 0xc1, 0xc6, 0xcf, 0xc8, 0xe5, 0xe2, 0xeb, 0xec, 0xf9, 0xfe, - 0xf7, 0xf0, 0xad, 0xaa, 0xa3, 0xa4, 0xb1, 0xb6, 0xbf, 0xb8, - 0x95, 0x92, 0x9b, 0x9c, 0x89, 0x8e, 0x87, 0x80, 0x3d, 0x3a, - 0x33, 0x34, 0x21, 0x26, 0x2f, 0x28, 0x05, 0x02, 0x0b, 0x0c, - 0x19, 0x1e, 0x17, 0x10, 0x4d, 0x4a, 0x43, 0x44, 0x51, 0x56, - 0x5f, 0x58, 0x75, 0x72, 0x7b, 0x7c, 0x69, 0x6e, 0x67, 0x60, - 0xa7, 0xa0, 0xa9, 0xae, 0xbb, 0xbc, 0xb5, 0xb2, 0x9f, 0x98, - 0x91, 0x96, 0x83, 0x84, 0x8d, 0x8a, 0xd7, 0xd0, 0xd9, 0xde, - 0xcb, 0xcc, 0xc5, 0xc2, 0xef, 0xe8, 0xe1, 0xe6, 0xf3, 0xf4, - 0xfd, 0xfa, 0x47, 0x40, 0x49, 0x4e, 0x5b, 0x5c, 0x55, 0x52, - 0x7f, 0x78, 0x71, 0x76, 0x63, 0x64, 0x6d, 0x6a, 0x37, 0x30, - 0x39, 0x3e, 0x2b, 0x2c, 0x25, 0x22, 0x0f, 0x08, 0x01, 0x06, - 0x13, 0x14, 0x1d, 0x1a, 0x7a, 0x7d, 0x74, 0x73, 0x66, 0x61, - 0x68, 0x6f, 0x42, 0x45, 0x4c, 0x4b, 0x5e, 0x59, 0x50, 0x57, - 0x0a, 0x0d, 0x04, 0x03, 0x16, 0x11, 0x18, 0x1f, 0x32, 0x35, - 0x3c, 0x3b, 0x2e, 0x29, 0x20, 0x27, 0x9a, 0x9d, 0x94, 0x93, - 0x86, 0x81, 0x88, 0x8f, 0xa2, 0xa5, 0xac, 0xab, 0xbe, 0xb9, - 0xb0, 0xb7, 0xea, 0xed, 0xe4, 0xe3, 0xf6, 0xf1, 0xf8, 0xff, - 0xd2, 0xd5, 0xdc, 0xdb, 0xce, 0xc9, 0xc0, 0xc7, 0x00, 0x08, - 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, - 0x60, 0x68, 0x70, 0x78, 0x80, 0x88, 0x90, 0x98, 0xa0, 0xa8, - 0xb0, 0xb8, 0xc0, 0xc8, 0xd0, 0xd8, 0xe0, 0xe8, 0xf0, 0xf8, - 0x1d, 0x15, 0x0d, 0x05, 0x3d, 0x35, 0x2d, 0x25, 0x5d, 0x55, - 0x4d, 0x45, 0x7d, 0x75, 0x6d, 0x65, 0x9d, 0x95, 0x8d, 0x85, - 0xbd, 0xb5, 0xad, 0xa5, 0xdd, 0xd5, 0xcd, 0xc5, 0xfd, 0xf5, - 0xed, 0xe5, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, - 0x7a, 0x72, 0x6a, 0x62, 0x5a, 0x52, 0x4a, 0x42, 0xba, 0xb2, - 0xaa, 0xa2, 0x9a, 0x92, 0x8a, 0x82, 0xfa, 0xf2, 0xea, 0xe2, - 0xda, 0xd2, 0xca, 0xc2, 0x27, 0x2f, 0x37, 0x3f, 0x07, 0x0f, - 0x17, 0x1f, 0x67, 0x6f, 0x77, 0x7f, 0x47, 0x4f, 0x57, 0x5f, - 0xa7, 0xaf, 0xb7, 0xbf, 0x87, 0x8f, 0x97, 0x9f, 0xe7, 0xef, - 0xf7, 0xff, 0xc7, 0xcf, 0xd7, 0xdf, 0x74, 0x7c, 0x64, 0x6c, - 0x54, 0x5c, 0x44, 0x4c, 0x34, 0x3c, 0x24, 0x2c, 0x14, 0x1c, - 0x04, 0x0c, 0xf4, 0xfc, 0xe4, 0xec, 0xd4, 0xdc, 0xc4, 0xcc, - 0xb4, 0xbc, 0xa4, 0xac, 0x94, 0x9c, 0x84, 0x8c, 0x69, 0x61, - 0x79, 0x71, 0x49, 0x41, 0x59, 0x51, 0x29, 0x21, 0x39, 0x31, - 0x09, 0x01, 0x19, 0x11, 0xe9, 0xe1, 0xf9, 0xf1, 0xc9, 0xc1, - 0xd9, 0xd1, 0xa9, 0xa1, 0xb9, 0xb1, 0x89, 0x81, 0x99, 0x91, - 0x4e, 0x46, 0x5e, 0x56, 0x6e, 0x66, 0x7e, 0x76, 0x0e, 0x06, - 0x1e, 0x16, 0x2e, 0x26, 0x3e, 0x36, 0xce, 0xc6, 0xde, 0xd6, - 0xee, 0xe6, 0xfe, 0xf6, 0x8e, 0x86, 0x9e, 0x96, 0xae, 0xa6, - 0xbe, 0xb6, 0x53, 0x5b, 0x43, 0x4b, 0x73, 0x7b, 0x63, 0x6b, - 0x13, 0x1b, 0x03, 0x0b, 0x33, 0x3b, 0x23, 0x2b, 0xd3, 0xdb, - 0xc3, 0xcb, 0xf3, 0xfb, 0xe3, 0xeb, 0x93, 0x9b, 0x83, 0x8b, - 0xb3, 0xbb, 0xa3, 0xab, 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, - 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, - 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, - 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, 0x3d, 0x34, 0x2f, 0x26, - 0x19, 0x10, 0x0b, 0x02, 0x75, 0x7c, 0x67, 0x6e, 0x51, 0x58, - 0x43, 0x4a, 0xad, 0xa4, 0xbf, 0xb6, 0x89, 0x80, 0x9b, 0x92, - 0xe5, 0xec, 0xf7, 0xfe, 0xc1, 0xc8, 0xd3, 0xda, 0x7a, 0x73, - 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x32, 0x3b, 0x20, 0x29, - 0x16, 0x1f, 0x04, 0x0d, 0xea, 0xe3, 0xf8, 0xf1, 0xce, 0xc7, - 0xdc, 0xd5, 0xa2, 0xab, 0xb0, 0xb9, 0x86, 0x8f, 0x94, 0x9d, - 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, - 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, 0xd7, 0xde, 0xc5, 0xcc, - 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, - 0xa9, 0xa0, 0xf4, 0xfd, 0xe6, 0xef, 0xd0, 0xd9, 0xc2, 0xcb, - 0xbc, 0xb5, 0xae, 0xa7, 0x98, 0x91, 0x8a, 0x83, 0x64, 0x6d, - 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, - 0x08, 0x01, 0x1a, 0x13, 0xc9, 0xc0, 0xdb, 0xd2, 0xed, 0xe4, - 0xff, 0xf6, 0x81, 0x88, 0x93, 0x9a, 0xa5, 0xac, 0xb7, 0xbe, - 0x59, 0x50, 0x4b, 0x42, 0x7d, 0x74, 0x6f, 0x66, 0x11, 0x18, - 0x03, 0x0a, 0x35, 0x3c, 0x27, 0x2e, 0x8e, 0x87, 0x9c, 0x95, - 0xaa, 0xa3, 0xb8, 0xb1, 0xc6, 0xcf, 0xd4, 0xdd, 0xe2, 0xeb, - 0xf0, 0xf9, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, - 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0xb3, 0xba, - 0xa1, 0xa8, 0x97, 0x9e, 0x85, 0x8c, 0xfb, 0xf2, 0xe9, 0xe0, - 0xdf, 0xd6, 0xcd, 0xc4, 0x23, 0x2a, 0x31, 0x38, 0x07, 0x0e, - 0x15, 0x1c, 0x6b, 0x62, 0x79, 0x70, 0x4f, 0x46, 0x5d, 0x54, - 0x00, 0x0a, 0x14, 0x1e, 0x28, 0x22, 0x3c, 0x36, 0x50, 0x5a, - 0x44, 0x4e, 0x78, 0x72, 0x6c, 0x66, 0xa0, 0xaa, 0xb4, 0xbe, - 0x88, 0x82, 0x9c, 0x96, 0xf0, 0xfa, 0xe4, 0xee, 0xd8, 0xd2, - 0xcc, 0xc6, 0x5d, 0x57, 0x49, 0x43, 0x75, 0x7f, 0x61, 0x6b, - 0x0d, 0x07, 0x19, 0x13, 0x25, 0x2f, 0x31, 0x3b, 0xfd, 0xf7, - 0xe9, 0xe3, 0xd5, 0xdf, 0xc1, 0xcb, 0xad, 0xa7, 0xb9, 0xb3, - 0x85, 0x8f, 0x91, 0x9b, 0xba, 0xb0, 0xae, 0xa4, 0x92, 0x98, - 0x86, 0x8c, 0xea, 0xe0, 0xfe, 0xf4, 0xc2, 0xc8, 0xd6, 0xdc, - 0x1a, 0x10, 0x0e, 0x04, 0x32, 0x38, 0x26, 0x2c, 0x4a, 0x40, - 0x5e, 0x54, 0x62, 0x68, 0x76, 0x7c, 0xe7, 0xed, 0xf3, 0xf9, - 0xcf, 0xc5, 0xdb, 0xd1, 0xb7, 0xbd, 0xa3, 0xa9, 0x9f, 0x95, - 0x8b, 0x81, 0x47, 0x4d, 0x53, 0x59, 0x6f, 0x65, 0x7b, 0x71, - 0x17, 0x1d, 0x03, 0x09, 0x3f, 0x35, 0x2b, 0x21, 0x69, 0x63, - 0x7d, 0x77, 0x41, 0x4b, 0x55, 0x5f, 0x39, 0x33, 0x2d, 0x27, - 0x11, 0x1b, 0x05, 0x0f, 0xc9, 0xc3, 0xdd, 0xd7, 0xe1, 0xeb, - 0xf5, 0xff, 0x99, 0x93, 0x8d, 0x87, 0xb1, 0xbb, 0xa5, 0xaf, - 0x34, 0x3e, 0x20, 0x2a, 0x1c, 0x16, 0x08, 0x02, 0x64, 0x6e, - 0x70, 0x7a, 0x4c, 0x46, 0x58, 0x52, 0x94, 0x9e, 0x80, 0x8a, - 0xbc, 0xb6, 0xa8, 0xa2, 0xc4, 0xce, 0xd0, 0xda, 0xec, 0xe6, - 0xf8, 0xf2, 0xd3, 0xd9, 0xc7, 0xcd, 0xfb, 0xf1, 0xef, 0xe5, - 0x83, 0x89, 0x97, 0x9d, 0xab, 0xa1, 0xbf, 0xb5, 0x73, 0x79, - 0x67, 0x6d, 0x5b, 0x51, 0x4f, 0x45, 0x23, 0x29, 0x37, 0x3d, - 0x0b, 0x01, 0x1f, 0x15, 0x8e, 0x84, 0x9a, 0x90, 0xa6, 0xac, - 0xb2, 0xb8, 0xde, 0xd4, 0xca, 0xc0, 0xf6, 0xfc, 0xe2, 0xe8, - 0x2e, 0x24, 0x3a, 0x30, 0x06, 0x0c, 0x12, 0x18, 0x7e, 0x74, - 0x6a, 0x60, 0x56, 0x5c, 0x42, 0x48, 0x00, 0x0b, 0x16, 0x1d, - 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, - 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, - 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, 0x7d, 0x76, - 0x6b, 0x60, 0x51, 0x5a, 0x47, 0x4c, 0x25, 0x2e, 0x33, 0x38, - 0x09, 0x02, 0x1f, 0x14, 0xcd, 0xc6, 0xdb, 0xd0, 0xe1, 0xea, - 0xf7, 0xfc, 0x95, 0x9e, 0x83, 0x88, 0xb9, 0xb2, 0xaf, 0xa4, - 0xfa, 0xf1, 0xec, 0xe7, 0xd6, 0xdd, 0xc0, 0xcb, 0xa2, 0xa9, - 0xb4, 0xbf, 0x8e, 0x85, 0x98, 0x93, 0x4a, 0x41, 0x5c, 0x57, - 0x66, 0x6d, 0x70, 0x7b, 0x12, 0x19, 0x04, 0x0f, 0x3e, 0x35, - 0x28, 0x23, 0x87, 0x8c, 0x91, 0x9a, 0xab, 0xa0, 0xbd, 0xb6, - 0xdf, 0xd4, 0xc9, 0xc2, 0xf3, 0xf8, 0xe5, 0xee, 0x37, 0x3c, - 0x21, 0x2a, 0x1b, 0x10, 0x0d, 0x06, 0x6f, 0x64, 0x79, 0x72, - 0x43, 0x48, 0x55, 0x5e, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, - 0xd3, 0xd8, 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, - 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0x01, 0x0a, - 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x94, 0x9f, 0x82, 0x89, - 0xb8, 0xb3, 0xae, 0xa5, 0xcc, 0xc7, 0xda, 0xd1, 0xe0, 0xeb, - 0xf6, 0xfd, 0x24, 0x2f, 0x32, 0x39, 0x08, 0x03, 0x1e, 0x15, - 0x7c, 0x77, 0x6a, 0x61, 0x50, 0x5b, 0x46, 0x4d, 0x13, 0x18, - 0x05, 0x0e, 0x3f, 0x34, 0x29, 0x22, 0x4b, 0x40, 0x5d, 0x56, - 0x67, 0x6c, 0x71, 0x7a, 0xa3, 0xa8, 0xb5, 0xbe, 0x8f, 0x84, - 0x99, 0x92, 0xfb, 0xf0, 0xed, 0xe6, 0xd7, 0xdc, 0xc1, 0xca, - 0x6e, 0x65, 0x78, 0x73, 0x42, 0x49, 0x54, 0x5f, 0x36, 0x3d, - 0x20, 0x2b, 0x1a, 0x11, 0x0c, 0x07, 0xde, 0xd5, 0xc8, 0xc3, - 0xf2, 0xf9, 0xe4, 0xef, 0x86, 0x8d, 0x90, 0x9b, 0xaa, 0xa1, - 0xbc, 0xb7, 0x00, 0x0c, 0x18, 0x14, 0x30, 0x3c, 0x28, 0x24, - 0x60, 0x6c, 0x78, 0x74, 0x50, 0x5c, 0x48, 0x44, 0xc0, 0xcc, - 0xd8, 0xd4, 0xf0, 0xfc, 0xe8, 0xe4, 0xa0, 0xac, 0xb8, 0xb4, - 0x90, 0x9c, 0x88, 0x84, 0x9d, 0x91, 0x85, 0x89, 0xad, 0xa1, - 0xb5, 0xb9, 0xfd, 0xf1, 0xe5, 0xe9, 0xcd, 0xc1, 0xd5, 0xd9, - 0x5d, 0x51, 0x45, 0x49, 0x6d, 0x61, 0x75, 0x79, 0x3d, 0x31, - 0x25, 0x29, 0x0d, 0x01, 0x15, 0x19, 0x27, 0x2b, 0x3f, 0x33, - 0x17, 0x1b, 0x0f, 0x03, 0x47, 0x4b, 0x5f, 0x53, 0x77, 0x7b, - 0x6f, 0x63, 0xe7, 0xeb, 0xff, 0xf3, 0xd7, 0xdb, 0xcf, 0xc3, - 0x87, 0x8b, 0x9f, 0x93, 0xb7, 0xbb, 0xaf, 0xa3, 0xba, 0xb6, - 0xa2, 0xae, 0x8a, 0x86, 0x92, 0x9e, 0xda, 0xd6, 0xc2, 0xce, - 0xea, 0xe6, 0xf2, 0xfe, 0x7a, 0x76, 0x62, 0x6e, 0x4a, 0x46, - 0x52, 0x5e, 0x1a, 0x16, 0x02, 0x0e, 0x2a, 0x26, 0x32, 0x3e, - 0x4e, 0x42, 0x56, 0x5a, 0x7e, 0x72, 0x66, 0x6a, 0x2e, 0x22, - 0x36, 0x3a, 0x1e, 0x12, 0x06, 0x0a, 0x8e, 0x82, 0x96, 0x9a, - 0xbe, 0xb2, 0xa6, 0xaa, 0xee, 0xe2, 0xf6, 0xfa, 0xde, 0xd2, - 0xc6, 0xca, 0xd3, 0xdf, 0xcb, 0xc7, 0xe3, 0xef, 0xfb, 0xf7, - 0xb3, 0xbf, 0xab, 0xa7, 0x83, 0x8f, 0x9b, 0x97, 0x13, 0x1f, - 0x0b, 0x07, 0x23, 0x2f, 0x3b, 0x37, 0x73, 0x7f, 0x6b, 0x67, - 0x43, 0x4f, 0x5b, 0x57, 0x69, 0x65, 0x71, 0x7d, 0x59, 0x55, - 0x41, 0x4d, 0x09, 0x05, 0x11, 0x1d, 0x39, 0x35, 0x21, 0x2d, - 0xa9, 0xa5, 0xb1, 0xbd, 0x99, 0x95, 0x81, 0x8d, 0xc9, 0xc5, - 0xd1, 0xdd, 0xf9, 0xf5, 0xe1, 0xed, 0xf4, 0xf8, 0xec, 0xe0, - 0xc4, 0xc8, 0xdc, 0xd0, 0x94, 0x98, 0x8c, 0x80, 0xa4, 0xa8, - 0xbc, 0xb0, 0x34, 0x38, 0x2c, 0x20, 0x04, 0x08, 0x1c, 0x10, - 0x54, 0x58, 0x4c, 0x40, 0x64, 0x68, 0x7c, 0x70, 0x00, 0x0d, - 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, - 0x5c, 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, - 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, - 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, - 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, 0x6d, 0x60, 0x77, 0x7a, - 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, - 0x2b, 0x26, 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, - 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0xb7, 0xba, - 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, - 0xeb, 0xe6, 0xf1, 0xfc, 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, - 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, - 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, - 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, 0xce, 0xc3, 0xd4, 0xd9, - 0xfa, 0xf7, 0xe0, 0xed, 0xa6, 0xab, 0xbc, 0xb1, 0x92, 0x9f, - 0x88, 0x85, 0x1e, 0x13, 0x04, 0x09, 0x2a, 0x27, 0x30, 0x3d, - 0x76, 0x7b, 0x6c, 0x61, 0x42, 0x4f, 0x58, 0x55, 0x73, 0x7e, - 0x69, 0x64, 0x47, 0x4a, 0x5d, 0x50, 0x1b, 0x16, 0x01, 0x0c, - 0x2f, 0x22, 0x35, 0x38, 0xa3, 0xae, 0xb9, 0xb4, 0x97, 0x9a, - 0x8d, 0x80, 0xcb, 0xc6, 0xd1, 0xdc, 0xff, 0xf2, 0xe5, 0xe8, - 0xa9, 0xa4, 0xb3, 0xbe, 0x9d, 0x90, 0x87, 0x8a, 0xc1, 0xcc, - 0xdb, 0xd6, 0xf5, 0xf8, 0xef, 0xe2, 0x79, 0x74, 0x63, 0x6e, - 0x4d, 0x40, 0x57, 0x5a, 0x11, 0x1c, 0x0b, 0x06, 0x25, 0x28, - 0x3f, 0x32, 0x14, 0x19, 0x0e, 0x03, 0x20, 0x2d, 0x3a, 0x37, - 0x7c, 0x71, 0x66, 0x6b, 0x48, 0x45, 0x52, 0x5f, 0xc4, 0xc9, - 0xde, 0xd3, 0xf0, 0xfd, 0xea, 0xe7, 0xac, 0xa1, 0xb6, 0xbb, - 0x98, 0x95, 0x82, 0x8f, 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, - 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, - 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, - 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, 0xdd, 0xd3, 0xc1, 0xcf, - 0xe5, 0xeb, 0xf9, 0xf7, 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, - 0x89, 0x87, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, - 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0xa7, 0xa9, - 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, 0xd7, 0xd9, 0xcb, 0xc5, - 0xef, 0xe1, 0xf3, 0xfd, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, - 0x63, 0x6d, 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, - 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, - 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, 0x9a, 0x94, 0x86, 0x88, - 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, - 0xce, 0xc0, 0x53, 0x5d, 0x4f, 0x41, 0x6b, 0x65, 0x77, 0x79, - 0x23, 0x2d, 0x3f, 0x31, 0x1b, 0x15, 0x07, 0x09, 0xb3, 0xbd, - 0xaf, 0xa1, 0x8b, 0x85, 0x97, 0x99, 0xc3, 0xcd, 0xdf, 0xd1, - 0xfb, 0xf5, 0xe7, 0xe9, 0x8e, 0x80, 0x92, 0x9c, 0xb6, 0xb8, - 0xaa, 0xa4, 0xfe, 0xf0, 0xe2, 0xec, 0xc6, 0xc8, 0xda, 0xd4, - 0x6e, 0x60, 0x72, 0x7c, 0x56, 0x58, 0x4a, 0x44, 0x1e, 0x10, - 0x02, 0x0c, 0x26, 0x28, 0x3a, 0x34, 0xf4, 0xfa, 0xe8, 0xe6, - 0xcc, 0xc2, 0xd0, 0xde, 0x84, 0x8a, 0x98, 0x96, 0xbc, 0xb2, - 0xa0, 0xae, 0x14, 0x1a, 0x08, 0x06, 0x2c, 0x22, 0x30, 0x3e, - 0x64, 0x6a, 0x78, 0x76, 0x5c, 0x52, 0x40, 0x4e, 0x29, 0x27, - 0x35, 0x3b, 0x11, 0x1f, 0x0d, 0x03, 0x59, 0x57, 0x45, 0x4b, - 0x61, 0x6f, 0x7d, 0x73, 0xc9, 0xc7, 0xd5, 0xdb, 0xf1, 0xff, - 0xed, 0xe3, 0xb9, 0xb7, 0xa5, 0xab, 0x81, 0x8f, 0x9d, 0x93, - 0x00, 0x0f, 0x1e, 0x11, 0x3c, 0x33, 0x22, 0x2d, 0x78, 0x77, - 0x66, 0x69, 0x44, 0x4b, 0x5a, 0x55, 0xf0, 0xff, 0xee, 0xe1, - 0xcc, 0xc3, 0xd2, 0xdd, 0x88, 0x87, 0x96, 0x99, 0xb4, 0xbb, - 0xaa, 0xa5, 0xfd, 0xf2, 0xe3, 0xec, 0xc1, 0xce, 0xdf, 0xd0, - 0x85, 0x8a, 0x9b, 0x94, 0xb9, 0xb6, 0xa7, 0xa8, 0x0d, 0x02, - 0x13, 0x1c, 0x31, 0x3e, 0x2f, 0x20, 0x75, 0x7a, 0x6b, 0x64, - 0x49, 0x46, 0x57, 0x58, 0xe7, 0xe8, 0xf9, 0xf6, 0xdb, 0xd4, - 0xc5, 0xca, 0x9f, 0x90, 0x81, 0x8e, 0xa3, 0xac, 0xbd, 0xb2, - 0x17, 0x18, 0x09, 0x06, 0x2b, 0x24, 0x35, 0x3a, 0x6f, 0x60, - 0x71, 0x7e, 0x53, 0x5c, 0x4d, 0x42, 0x1a, 0x15, 0x04, 0x0b, - 0x26, 0x29, 0x38, 0x37, 0x62, 0x6d, 0x7c, 0x73, 0x5e, 0x51, - 0x40, 0x4f, 0xea, 0xe5, 0xf4, 0xfb, 0xd6, 0xd9, 0xc8, 0xc7, - 0x92, 0x9d, 0x8c, 0x83, 0xae, 0xa1, 0xb0, 0xbf, 0xd3, 0xdc, - 0xcd, 0xc2, 0xef, 0xe0, 0xf1, 0xfe, 0xab, 0xa4, 0xb5, 0xba, - 0x97, 0x98, 0x89, 0x86, 0x23, 0x2c, 0x3d, 0x32, 0x1f, 0x10, - 0x01, 0x0e, 0x5b, 0x54, 0x45, 0x4a, 0x67, 0x68, 0x79, 0x76, - 0x2e, 0x21, 0x30, 0x3f, 0x12, 0x1d, 0x0c, 0x03, 0x56, 0x59, - 0x48, 0x47, 0x6a, 0x65, 0x74, 0x7b, 0xde, 0xd1, 0xc0, 0xcf, - 0xe2, 0xed, 0xfc, 0xf3, 0xa6, 0xa9, 0xb8, 0xb7, 0x9a, 0x95, - 0x84, 0x8b, 0x34, 0x3b, 0x2a, 0x25, 0x08, 0x07, 0x16, 0x19, - 0x4c, 0x43, 0x52, 0x5d, 0x70, 0x7f, 0x6e, 0x61, 0xc4, 0xcb, - 0xda, 0xd5, 0xf8, 0xf7, 0xe6, 0xe9, 0xbc, 0xb3, 0xa2, 0xad, - 0x80, 0x8f, 0x9e, 0x91, 0xc9, 0xc6, 0xd7, 0xd8, 0xf5, 0xfa, - 0xeb, 0xe4, 0xb1, 0xbe, 0xaf, 0xa0, 0x8d, 0x82, 0x93, 0x9c, - 0x39, 0x36, 0x27, 0x28, 0x05, 0x0a, 0x1b, 0x14, 0x41, 0x4e, - 0x5f, 0x50, 0x7d, 0x72, 0x63, 0x6c, 0x00, 0x10, 0x20, 0x30, - 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, - 0xe0, 0xf0, 0x1d, 0x0d, 0x3d, 0x2d, 0x5d, 0x4d, 0x7d, 0x6d, - 0x9d, 0x8d, 0xbd, 0xad, 0xdd, 0xcd, 0xfd, 0xed, 0x3a, 0x2a, - 0x1a, 0x0a, 0x7a, 0x6a, 0x5a, 0x4a, 0xba, 0xaa, 0x9a, 0x8a, - 0xfa, 0xea, 0xda, 0xca, 0x27, 0x37, 0x07, 0x17, 0x67, 0x77, - 0x47, 0x57, 0xa7, 0xb7, 0x87, 0x97, 0xe7, 0xf7, 0xc7, 0xd7, - 0x74, 0x64, 0x54, 0x44, 0x34, 0x24, 0x14, 0x04, 0xf4, 0xe4, - 0xd4, 0xc4, 0xb4, 0xa4, 0x94, 0x84, 0x69, 0x79, 0x49, 0x59, - 0x29, 0x39, 0x09, 0x19, 0xe9, 0xf9, 0xc9, 0xd9, 0xa9, 0xb9, - 0x89, 0x99, 0x4e, 0x5e, 0x6e, 0x7e, 0x0e, 0x1e, 0x2e, 0x3e, - 0xce, 0xde, 0xee, 0xfe, 0x8e, 0x9e, 0xae, 0xbe, 0x53, 0x43, - 0x73, 0x63, 0x13, 0x03, 0x33, 0x23, 0xd3, 0xc3, 0xf3, 0xe3, - 0x93, 0x83, 0xb3, 0xa3, 0xe8, 0xf8, 0xc8, 0xd8, 0xa8, 0xb8, - 0x88, 0x98, 0x68, 0x78, 0x48, 0x58, 0x28, 0x38, 0x08, 0x18, - 0xf5, 0xe5, 0xd5, 0xc5, 0xb5, 0xa5, 0x95, 0x85, 0x75, 0x65, - 0x55, 0x45, 0x35, 0x25, 0x15, 0x05, 0xd2, 0xc2, 0xf2, 0xe2, - 0x92, 0x82, 0xb2, 0xa2, 0x52, 0x42, 0x72, 0x62, 0x12, 0x02, - 0x32, 0x22, 0xcf, 0xdf, 0xef, 0xff, 0x8f, 0x9f, 0xaf, 0xbf, - 0x4f, 0x5f, 0x6f, 0x7f, 0x0f, 0x1f, 0x2f, 0x3f, 0x9c, 0x8c, - 0xbc, 0xac, 0xdc, 0xcc, 0xfc, 0xec, 0x1c, 0x0c, 0x3c, 0x2c, - 0x5c, 0x4c, 0x7c, 0x6c, 0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, - 0xe1, 0xf1, 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, - 0xa6, 0xb6, 0x86, 0x96, 0xe6, 0xf6, 0xc6, 0xd6, 0x26, 0x36, - 0x06, 0x16, 0x66, 0x76, 0x46, 0x56, 0xbb, 0xab, 0x9b, 0x8b, - 0xfb, 0xeb, 0xdb, 0xcb, 0x3b, 0x2b, 0x1b, 0x0b, 0x7b, 0x6b, - 0x5b, 0x4b, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x0d, 0x1c, - 0x2f, 0x3e, 0x49, 0x58, 0x6b, 0x7a, 0x85, 0x94, 0xa7, 0xb6, - 0xc1, 0xd0, 0xe3, 0xf2, 0x1a, 0x0b, 0x38, 0x29, 0x5e, 0x4f, - 0x7c, 0x6d, 0x92, 0x83, 0xb0, 0xa1, 0xd6, 0xc7, 0xf4, 0xe5, - 0x17, 0x06, 0x35, 0x24, 0x53, 0x42, 0x71, 0x60, 0x9f, 0x8e, - 0xbd, 0xac, 0xdb, 0xca, 0xf9, 0xe8, 0x34, 0x25, 0x16, 0x07, - 0x70, 0x61, 0x52, 0x43, 0xbc, 0xad, 0x9e, 0x8f, 0xf8, 0xe9, - 0xda, 0xcb, 0x39, 0x28, 0x1b, 0x0a, 0x7d, 0x6c, 0x5f, 0x4e, - 0xb1, 0xa0, 0x93, 0x82, 0xf5, 0xe4, 0xd7, 0xc6, 0x2e, 0x3f, - 0x0c, 0x1d, 0x6a, 0x7b, 0x48, 0x59, 0xa6, 0xb7, 0x84, 0x95, - 0xe2, 0xf3, 0xc0, 0xd1, 0x23, 0x32, 0x01, 0x10, 0x67, 0x76, - 0x45, 0x54, 0xab, 0xba, 0x89, 0x98, 0xef, 0xfe, 0xcd, 0xdc, - 0x68, 0x79, 0x4a, 0x5b, 0x2c, 0x3d, 0x0e, 0x1f, 0xe0, 0xf1, - 0xc2, 0xd3, 0xa4, 0xb5, 0x86, 0x97, 0x65, 0x74, 0x47, 0x56, - 0x21, 0x30, 0x03, 0x12, 0xed, 0xfc, 0xcf, 0xde, 0xa9, 0xb8, - 0x8b, 0x9a, 0x72, 0x63, 0x50, 0x41, 0x36, 0x27, 0x14, 0x05, - 0xfa, 0xeb, 0xd8, 0xc9, 0xbe, 0xaf, 0x9c, 0x8d, 0x7f, 0x6e, - 0x5d, 0x4c, 0x3b, 0x2a, 0x19, 0x08, 0xf7, 0xe6, 0xd5, 0xc4, - 0xb3, 0xa2, 0x91, 0x80, 0x5c, 0x4d, 0x7e, 0x6f, 0x18, 0x09, - 0x3a, 0x2b, 0xd4, 0xc5, 0xf6, 0xe7, 0x90, 0x81, 0xb2, 0xa3, - 0x51, 0x40, 0x73, 0x62, 0x15, 0x04, 0x37, 0x26, 0xd9, 0xc8, - 0xfb, 0xea, 0x9d, 0x8c, 0xbf, 0xae, 0x46, 0x57, 0x64, 0x75, - 0x02, 0x13, 0x20, 0x31, 0xce, 0xdf, 0xec, 0xfd, 0x8a, 0x9b, - 0xa8, 0xb9, 0x4b, 0x5a, 0x69, 0x78, 0x0f, 0x1e, 0x2d, 0x3c, - 0xc3, 0xd2, 0xe1, 0xf0, 0x87, 0x96, 0xa5, 0xb4, 0x00, 0x12, - 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e, 0x90, 0x82, 0xb4, 0xa6, - 0xd8, 0xca, 0xfc, 0xee, 0x3d, 0x2f, 0x19, 0x0b, 0x75, 0x67, - 0x51, 0x43, 0xad, 0xbf, 0x89, 0x9b, 0xe5, 0xf7, 0xc1, 0xd3, - 0x7a, 0x68, 0x5e, 0x4c, 0x32, 0x20, 0x16, 0x04, 0xea, 0xf8, - 0xce, 0xdc, 0xa2, 0xb0, 0x86, 0x94, 0x47, 0x55, 0x63, 0x71, - 0x0f, 0x1d, 0x2b, 0x39, 0xd7, 0xc5, 0xf3, 0xe1, 0x9f, 0x8d, - 0xbb, 0xa9, 0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a, - 0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a, 0xc9, 0xdb, - 0xed, 0xff, 0x81, 0x93, 0xa5, 0xb7, 0x59, 0x4b, 0x7d, 0x6f, - 0x11, 0x03, 0x35, 0x27, 0x8e, 0x9c, 0xaa, 0xb8, 0xc6, 0xd4, - 0xe2, 0xf0, 0x1e, 0x0c, 0x3a, 0x28, 0x56, 0x44, 0x72, 0x60, - 0xb3, 0xa1, 0x97, 0x85, 0xfb, 0xe9, 0xdf, 0xcd, 0x23, 0x31, - 0x07, 0x15, 0x6b, 0x79, 0x4f, 0x5d, 0xf5, 0xe7, 0xd1, 0xc3, - 0xbd, 0xaf, 0x99, 0x8b, 0x65, 0x77, 0x41, 0x53, 0x2d, 0x3f, - 0x09, 0x1b, 0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6, - 0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26, 0x8f, 0x9d, - 0xab, 0xb9, 0xc7, 0xd5, 0xe3, 0xf1, 0x1f, 0x0d, 0x3b, 0x29, - 0x57, 0x45, 0x73, 0x61, 0xb2, 0xa0, 0x96, 0x84, 0xfa, 0xe8, - 0xde, 0xcc, 0x22, 0x30, 0x06, 0x14, 0x6a, 0x78, 0x4e, 0x5c, - 0x01, 0x13, 0x25, 0x37, 0x49, 0x5b, 0x6d, 0x7f, 0x91, 0x83, - 0xb5, 0xa7, 0xd9, 0xcb, 0xfd, 0xef, 0x3c, 0x2e, 0x18, 0x0a, - 0x74, 0x66, 0x50, 0x42, 0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, - 0xc0, 0xd2, 0x7b, 0x69, 0x5f, 0x4d, 0x33, 0x21, 0x17, 0x05, - 0xeb, 0xf9, 0xcf, 0xdd, 0xa3, 0xb1, 0x87, 0x95, 0x46, 0x54, - 0x62, 0x70, 0x0e, 0x1c, 0x2a, 0x38, 0xd6, 0xc4, 0xf2, 0xe0, - 0x9e, 0x8c, 0xba, 0xa8, 0x00, 0x13, 0x26, 0x35, 0x4c, 0x5f, - 0x6a, 0x79, 0x98, 0x8b, 0xbe, 0xad, 0xd4, 0xc7, 0xf2, 0xe1, - 0x2d, 0x3e, 0x0b, 0x18, 0x61, 0x72, 0x47, 0x54, 0xb5, 0xa6, - 0x93, 0x80, 0xf9, 0xea, 0xdf, 0xcc, 0x5a, 0x49, 0x7c, 0x6f, - 0x16, 0x05, 0x30, 0x23, 0xc2, 0xd1, 0xe4, 0xf7, 0x8e, 0x9d, - 0xa8, 0xbb, 0x77, 0x64, 0x51, 0x42, 0x3b, 0x28, 0x1d, 0x0e, - 0xef, 0xfc, 0xc9, 0xda, 0xa3, 0xb0, 0x85, 0x96, 0xb4, 0xa7, - 0x92, 0x81, 0xf8, 0xeb, 0xde, 0xcd, 0x2c, 0x3f, 0x0a, 0x19, - 0x60, 0x73, 0x46, 0x55, 0x99, 0x8a, 0xbf, 0xac, 0xd5, 0xc6, - 0xf3, 0xe0, 0x01, 0x12, 0x27, 0x34, 0x4d, 0x5e, 0x6b, 0x78, - 0xee, 0xfd, 0xc8, 0xdb, 0xa2, 0xb1, 0x84, 0x97, 0x76, 0x65, - 0x50, 0x43, 0x3a, 0x29, 0x1c, 0x0f, 0xc3, 0xd0, 0xe5, 0xf6, - 0x8f, 0x9c, 0xa9, 0xba, 0x5b, 0x48, 0x7d, 0x6e, 0x17, 0x04, - 0x31, 0x22, 0x75, 0x66, 0x53, 0x40, 0x39, 0x2a, 0x1f, 0x0c, - 0xed, 0xfe, 0xcb, 0xd8, 0xa1, 0xb2, 0x87, 0x94, 0x58, 0x4b, - 0x7e, 0x6d, 0x14, 0x07, 0x32, 0x21, 0xc0, 0xd3, 0xe6, 0xf5, - 0x8c, 0x9f, 0xaa, 0xb9, 0x2f, 0x3c, 0x09, 0x1a, 0x63, 0x70, - 0x45, 0x56, 0xb7, 0xa4, 0x91, 0x82, 0xfb, 0xe8, 0xdd, 0xce, - 0x02, 0x11, 0x24, 0x37, 0x4e, 0x5d, 0x68, 0x7b, 0x9a, 0x89, - 0xbc, 0xaf, 0xd6, 0xc5, 0xf0, 0xe3, 0xc1, 0xd2, 0xe7, 0xf4, - 0x8d, 0x9e, 0xab, 0xb8, 0x59, 0x4a, 0x7f, 0x6c, 0x15, 0x06, - 0x33, 0x20, 0xec, 0xff, 0xca, 0xd9, 0xa0, 0xb3, 0x86, 0x95, - 0x74, 0x67, 0x52, 0x41, 0x38, 0x2b, 0x1e, 0x0d, 0x9b, 0x88, - 0xbd, 0xae, 0xd7, 0xc4, 0xf1, 0xe2, 0x03, 0x10, 0x25, 0x36, - 0x4f, 0x5c, 0x69, 0x7a, 0xb6, 0xa5, 0x90, 0x83, 0xfa, 0xe9, - 0xdc, 0xcf, 0x2e, 0x3d, 0x08, 0x1b, 0x62, 0x71, 0x44, 0x57, - 0x00, 0x14, 0x28, 0x3c, 0x50, 0x44, 0x78, 0x6c, 0xa0, 0xb4, - 0x88, 0x9c, 0xf0, 0xe4, 0xd8, 0xcc, 0x5d, 0x49, 0x75, 0x61, - 0x0d, 0x19, 0x25, 0x31, 0xfd, 0xe9, 0xd5, 0xc1, 0xad, 0xb9, - 0x85, 0x91, 0xba, 0xae, 0x92, 0x86, 0xea, 0xfe, 0xc2, 0xd6, - 0x1a, 0x0e, 0x32, 0x26, 0x4a, 0x5e, 0x62, 0x76, 0xe7, 0xf3, - 0xcf, 0xdb, 0xb7, 0xa3, 0x9f, 0x8b, 0x47, 0x53, 0x6f, 0x7b, - 0x17, 0x03, 0x3f, 0x2b, 0x69, 0x7d, 0x41, 0x55, 0x39, 0x2d, - 0x11, 0x05, 0xc9, 0xdd, 0xe1, 0xf5, 0x99, 0x8d, 0xb1, 0xa5, - 0x34, 0x20, 0x1c, 0x08, 0x64, 0x70, 0x4c, 0x58, 0x94, 0x80, - 0xbc, 0xa8, 0xc4, 0xd0, 0xec, 0xf8, 0xd3, 0xc7, 0xfb, 0xef, - 0x83, 0x97, 0xab, 0xbf, 0x73, 0x67, 0x5b, 0x4f, 0x23, 0x37, - 0x0b, 0x1f, 0x8e, 0x9a, 0xa6, 0xb2, 0xde, 0xca, 0xf6, 0xe2, - 0x2e, 0x3a, 0x06, 0x12, 0x7e, 0x6a, 0x56, 0x42, 0xd2, 0xc6, - 0xfa, 0xee, 0x82, 0x96, 0xaa, 0xbe, 0x72, 0x66, 0x5a, 0x4e, - 0x22, 0x36, 0x0a, 0x1e, 0x8f, 0x9b, 0xa7, 0xb3, 0xdf, 0xcb, - 0xf7, 0xe3, 0x2f, 0x3b, 0x07, 0x13, 0x7f, 0x6b, 0x57, 0x43, - 0x68, 0x7c, 0x40, 0x54, 0x38, 0x2c, 0x10, 0x04, 0xc8, 0xdc, - 0xe0, 0xf4, 0x98, 0x8c, 0xb0, 0xa4, 0x35, 0x21, 0x1d, 0x09, - 0x65, 0x71, 0x4d, 0x59, 0x95, 0x81, 0xbd, 0xa9, 0xc5, 0xd1, - 0xed, 0xf9, 0xbb, 0xaf, 0x93, 0x87, 0xeb, 0xff, 0xc3, 0xd7, - 0x1b, 0x0f, 0x33, 0x27, 0x4b, 0x5f, 0x63, 0x77, 0xe6, 0xf2, - 0xce, 0xda, 0xb6, 0xa2, 0x9e, 0x8a, 0x46, 0x52, 0x6e, 0x7a, - 0x16, 0x02, 0x3e, 0x2a, 0x01, 0x15, 0x29, 0x3d, 0x51, 0x45, - 0x79, 0x6d, 0xa1, 0xb5, 0x89, 0x9d, 0xf1, 0xe5, 0xd9, 0xcd, - 0x5c, 0x48, 0x74, 0x60, 0x0c, 0x18, 0x24, 0x30, 0xfc, 0xe8, - 0xd4, 0xc0, 0xac, 0xb8, 0x84, 0x90, 0x00, 0x15, 0x2a, 0x3f, - 0x54, 0x41, 0x7e, 0x6b, 0xa8, 0xbd, 0x82, 0x97, 0xfc, 0xe9, - 0xd6, 0xc3, 0x4d, 0x58, 0x67, 0x72, 0x19, 0x0c, 0x33, 0x26, - 0xe5, 0xf0, 0xcf, 0xda, 0xb1, 0xa4, 0x9b, 0x8e, 0x9a, 0x8f, - 0xb0, 0xa5, 0xce, 0xdb, 0xe4, 0xf1, 0x32, 0x27, 0x18, 0x0d, - 0x66, 0x73, 0x4c, 0x59, 0xd7, 0xc2, 0xfd, 0xe8, 0x83, 0x96, - 0xa9, 0xbc, 0x7f, 0x6a, 0x55, 0x40, 0x2b, 0x3e, 0x01, 0x14, - 0x29, 0x3c, 0x03, 0x16, 0x7d, 0x68, 0x57, 0x42, 0x81, 0x94, - 0xab, 0xbe, 0xd5, 0xc0, 0xff, 0xea, 0x64, 0x71, 0x4e, 0x5b, - 0x30, 0x25, 0x1a, 0x0f, 0xcc, 0xd9, 0xe6, 0xf3, 0x98, 0x8d, - 0xb2, 0xa7, 0xb3, 0xa6, 0x99, 0x8c, 0xe7, 0xf2, 0xcd, 0xd8, - 0x1b, 0x0e, 0x31, 0x24, 0x4f, 0x5a, 0x65, 0x70, 0xfe, 0xeb, - 0xd4, 0xc1, 0xaa, 0xbf, 0x80, 0x95, 0x56, 0x43, 0x7c, 0x69, - 0x02, 0x17, 0x28, 0x3d, 0x52, 0x47, 0x78, 0x6d, 0x06, 0x13, - 0x2c, 0x39, 0xfa, 0xef, 0xd0, 0xc5, 0xae, 0xbb, 0x84, 0x91, - 0x1f, 0x0a, 0x35, 0x20, 0x4b, 0x5e, 0x61, 0x74, 0xb7, 0xa2, - 0x9d, 0x88, 0xe3, 0xf6, 0xc9, 0xdc, 0xc8, 0xdd, 0xe2, 0xf7, - 0x9c, 0x89, 0xb6, 0xa3, 0x60, 0x75, 0x4a, 0x5f, 0x34, 0x21, - 0x1e, 0x0b, 0x85, 0x90, 0xaf, 0xba, 0xd1, 0xc4, 0xfb, 0xee, - 0x2d, 0x38, 0x07, 0x12, 0x79, 0x6c, 0x53, 0x46, 0x7b, 0x6e, - 0x51, 0x44, 0x2f, 0x3a, 0x05, 0x10, 0xd3, 0xc6, 0xf9, 0xec, - 0x87, 0x92, 0xad, 0xb8, 0x36, 0x23, 0x1c, 0x09, 0x62, 0x77, - 0x48, 0x5d, 0x9e, 0x8b, 0xb4, 0xa1, 0xca, 0xdf, 0xe0, 0xf5, - 0xe1, 0xf4, 0xcb, 0xde, 0xb5, 0xa0, 0x9f, 0x8a, 0x49, 0x5c, - 0x63, 0x76, 0x1d, 0x08, 0x37, 0x22, 0xac, 0xb9, 0x86, 0x93, - 0xf8, 0xed, 0xd2, 0xc7, 0x04, 0x11, 0x2e, 0x3b, 0x50, 0x45, - 0x7a, 0x6f, 0x00, 0x16, 0x2c, 0x3a, 0x58, 0x4e, 0x74, 0x62, - 0xb0, 0xa6, 0x9c, 0x8a, 0xe8, 0xfe, 0xc4, 0xd2, 0x7d, 0x6b, - 0x51, 0x47, 0x25, 0x33, 0x09, 0x1f, 0xcd, 0xdb, 0xe1, 0xf7, - 0x95, 0x83, 0xb9, 0xaf, 0xfa, 0xec, 0xd6, 0xc0, 0xa2, 0xb4, - 0x8e, 0x98, 0x4a, 0x5c, 0x66, 0x70, 0x12, 0x04, 0x3e, 0x28, - 0x87, 0x91, 0xab, 0xbd, 0xdf, 0xc9, 0xf3, 0xe5, 0x37, 0x21, - 0x1b, 0x0d, 0x6f, 0x79, 0x43, 0x55, 0xe9, 0xff, 0xc5, 0xd3, - 0xb1, 0xa7, 0x9d, 0x8b, 0x59, 0x4f, 0x75, 0x63, 0x01, 0x17, - 0x2d, 0x3b, 0x94, 0x82, 0xb8, 0xae, 0xcc, 0xda, 0xe0, 0xf6, - 0x24, 0x32, 0x08, 0x1e, 0x7c, 0x6a, 0x50, 0x46, 0x13, 0x05, - 0x3f, 0x29, 0x4b, 0x5d, 0x67, 0x71, 0xa3, 0xb5, 0x8f, 0x99, - 0xfb, 0xed, 0xd7, 0xc1, 0x6e, 0x78, 0x42, 0x54, 0x36, 0x20, - 0x1a, 0x0c, 0xde, 0xc8, 0xf2, 0xe4, 0x86, 0x90, 0xaa, 0xbc, - 0xcf, 0xd9, 0xe3, 0xf5, 0x97, 0x81, 0xbb, 0xad, 0x7f, 0x69, - 0x53, 0x45, 0x27, 0x31, 0x0b, 0x1d, 0xb2, 0xa4, 0x9e, 0x88, - 0xea, 0xfc, 0xc6, 0xd0, 0x02, 0x14, 0x2e, 0x38, 0x5a, 0x4c, - 0x76, 0x60, 0x35, 0x23, 0x19, 0x0f, 0x6d, 0x7b, 0x41, 0x57, - 0x85, 0x93, 0xa9, 0xbf, 0xdd, 0xcb, 0xf1, 0xe7, 0x48, 0x5e, - 0x64, 0x72, 0x10, 0x06, 0x3c, 0x2a, 0xf8, 0xee, 0xd4, 0xc2, - 0xa0, 0xb6, 0x8c, 0x9a, 0x26, 0x30, 0x0a, 0x1c, 0x7e, 0x68, - 0x52, 0x44, 0x96, 0x80, 0xba, 0xac, 0xce, 0xd8, 0xe2, 0xf4, - 0x5b, 0x4d, 0x77, 0x61, 0x03, 0x15, 0x2f, 0x39, 0xeb, 0xfd, - 0xc7, 0xd1, 0xb3, 0xa5, 0x9f, 0x89, 0xdc, 0xca, 0xf0, 0xe6, - 0x84, 0x92, 0xa8, 0xbe, 0x6c, 0x7a, 0x40, 0x56, 0x34, 0x22, - 0x18, 0x0e, 0xa1, 0xb7, 0x8d, 0x9b, 0xf9, 0xef, 0xd5, 0xc3, - 0x11, 0x07, 0x3d, 0x2b, 0x49, 0x5f, 0x65, 0x73, 0x00, 0x17, - 0x2e, 0x39, 0x5c, 0x4b, 0x72, 0x65, 0xb8, 0xaf, 0x96, 0x81, - 0xe4, 0xf3, 0xca, 0xdd, 0x6d, 0x7a, 0x43, 0x54, 0x31, 0x26, - 0x1f, 0x08, 0xd5, 0xc2, 0xfb, 0xec, 0x89, 0x9e, 0xa7, 0xb0, - 0xda, 0xcd, 0xf4, 0xe3, 0x86, 0x91, 0xa8, 0xbf, 0x62, 0x75, - 0x4c, 0x5b, 0x3e, 0x29, 0x10, 0x07, 0xb7, 0xa0, 0x99, 0x8e, - 0xeb, 0xfc, 0xc5, 0xd2, 0x0f, 0x18, 0x21, 0x36, 0x53, 0x44, - 0x7d, 0x6a, 0xa9, 0xbe, 0x87, 0x90, 0xf5, 0xe2, 0xdb, 0xcc, - 0x11, 0x06, 0x3f, 0x28, 0x4d, 0x5a, 0x63, 0x74, 0xc4, 0xd3, - 0xea, 0xfd, 0x98, 0x8f, 0xb6, 0xa1, 0x7c, 0x6b, 0x52, 0x45, - 0x20, 0x37, 0x0e, 0x19, 0x73, 0x64, 0x5d, 0x4a, 0x2f, 0x38, - 0x01, 0x16, 0xcb, 0xdc, 0xe5, 0xf2, 0x97, 0x80, 0xb9, 0xae, - 0x1e, 0x09, 0x30, 0x27, 0x42, 0x55, 0x6c, 0x7b, 0xa6, 0xb1, - 0x88, 0x9f, 0xfa, 0xed, 0xd4, 0xc3, 0x4f, 0x58, 0x61, 0x76, - 0x13, 0x04, 0x3d, 0x2a, 0xf7, 0xe0, 0xd9, 0xce, 0xab, 0xbc, - 0x85, 0x92, 0x22, 0x35, 0x0c, 0x1b, 0x7e, 0x69, 0x50, 0x47, - 0x9a, 0x8d, 0xb4, 0xa3, 0xc6, 0xd1, 0xe8, 0xff, 0x95, 0x82, - 0xbb, 0xac, 0xc9, 0xde, 0xe7, 0xf0, 0x2d, 0x3a, 0x03, 0x14, - 0x71, 0x66, 0x5f, 0x48, 0xf8, 0xef, 0xd6, 0xc1, 0xa4, 0xb3, - 0x8a, 0x9d, 0x40, 0x57, 0x6e, 0x79, 0x1c, 0x0b, 0x32, 0x25, - 0xe6, 0xf1, 0xc8, 0xdf, 0xba, 0xad, 0x94, 0x83, 0x5e, 0x49, - 0x70, 0x67, 0x02, 0x15, 0x2c, 0x3b, 0x8b, 0x9c, 0xa5, 0xb2, - 0xd7, 0xc0, 0xf9, 0xee, 0x33, 0x24, 0x1d, 0x0a, 0x6f, 0x78, - 0x41, 0x56, 0x3c, 0x2b, 0x12, 0x05, 0x60, 0x77, 0x4e, 0x59, - 0x84, 0x93, 0xaa, 0xbd, 0xd8, 0xcf, 0xf6, 0xe1, 0x51, 0x46, - 0x7f, 0x68, 0x0d, 0x1a, 0x23, 0x34, 0xe9, 0xfe, 0xc7, 0xd0, - 0xb5, 0xa2, 0x9b, 0x8c, 0x00, 0x18, 0x30, 0x28, 0x60, 0x78, - 0x50, 0x48, 0xc0, 0xd8, 0xf0, 0xe8, 0xa0, 0xb8, 0x90, 0x88, - 0x9d, 0x85, 0xad, 0xb5, 0xfd, 0xe5, 0xcd, 0xd5, 0x5d, 0x45, - 0x6d, 0x75, 0x3d, 0x25, 0x0d, 0x15, 0x27, 0x3f, 0x17, 0x0f, - 0x47, 0x5f, 0x77, 0x6f, 0xe7, 0xff, 0xd7, 0xcf, 0x87, 0x9f, - 0xb7, 0xaf, 0xba, 0xa2, 0x8a, 0x92, 0xda, 0xc2, 0xea, 0xf2, - 0x7a, 0x62, 0x4a, 0x52, 0x1a, 0x02, 0x2a, 0x32, 0x4e, 0x56, - 0x7e, 0x66, 0x2e, 0x36, 0x1e, 0x06, 0x8e, 0x96, 0xbe, 0xa6, - 0xee, 0xf6, 0xde, 0xc6, 0xd3, 0xcb, 0xe3, 0xfb, 0xb3, 0xab, - 0x83, 0x9b, 0x13, 0x0b, 0x23, 0x3b, 0x73, 0x6b, 0x43, 0x5b, - 0x69, 0x71, 0x59, 0x41, 0x09, 0x11, 0x39, 0x21, 0xa9, 0xb1, - 0x99, 0x81, 0xc9, 0xd1, 0xf9, 0xe1, 0xf4, 0xec, 0xc4, 0xdc, - 0x94, 0x8c, 0xa4, 0xbc, 0x34, 0x2c, 0x04, 0x1c, 0x54, 0x4c, - 0x64, 0x7c, 0x9c, 0x84, 0xac, 0xb4, 0xfc, 0xe4, 0xcc, 0xd4, - 0x5c, 0x44, 0x6c, 0x74, 0x3c, 0x24, 0x0c, 0x14, 0x01, 0x19, - 0x31, 0x29, 0x61, 0x79, 0x51, 0x49, 0xc1, 0xd9, 0xf1, 0xe9, - 0xa1, 0xb9, 0x91, 0x89, 0xbb, 0xa3, 0x8b, 0x93, 0xdb, 0xc3, - 0xeb, 0xf3, 0x7b, 0x63, 0x4b, 0x53, 0x1b, 0x03, 0x2b, 0x33, - 0x26, 0x3e, 0x16, 0x0e, 0x46, 0x5e, 0x76, 0x6e, 0xe6, 0xfe, - 0xd6, 0xce, 0x86, 0x9e, 0xb6, 0xae, 0xd2, 0xca, 0xe2, 0xfa, - 0xb2, 0xaa, 0x82, 0x9a, 0x12, 0x0a, 0x22, 0x3a, 0x72, 0x6a, - 0x42, 0x5a, 0x4f, 0x57, 0x7f, 0x67, 0x2f, 0x37, 0x1f, 0x07, - 0x8f, 0x97, 0xbf, 0xa7, 0xef, 0xf7, 0xdf, 0xc7, 0xf5, 0xed, - 0xc5, 0xdd, 0x95, 0x8d, 0xa5, 0xbd, 0x35, 0x2d, 0x05, 0x1d, - 0x55, 0x4d, 0x65, 0x7d, 0x68, 0x70, 0x58, 0x40, 0x08, 0x10, - 0x38, 0x20, 0xa8, 0xb0, 0x98, 0x80, 0xc8, 0xd0, 0xf8, 0xe0, - 0x00, 0x19, 0x32, 0x2b, 0x64, 0x7d, 0x56, 0x4f, 0xc8, 0xd1, - 0xfa, 0xe3, 0xac, 0xb5, 0x9e, 0x87, 0x8d, 0x94, 0xbf, 0xa6, - 0xe9, 0xf0, 0xdb, 0xc2, 0x45, 0x5c, 0x77, 0x6e, 0x21, 0x38, - 0x13, 0x0a, 0x07, 0x1e, 0x35, 0x2c, 0x63, 0x7a, 0x51, 0x48, - 0xcf, 0xd6, 0xfd, 0xe4, 0xab, 0xb2, 0x99, 0x80, 0x8a, 0x93, - 0xb8, 0xa1, 0xee, 0xf7, 0xdc, 0xc5, 0x42, 0x5b, 0x70, 0x69, - 0x26, 0x3f, 0x14, 0x0d, 0x0e, 0x17, 0x3c, 0x25, 0x6a, 0x73, - 0x58, 0x41, 0xc6, 0xdf, 0xf4, 0xed, 0xa2, 0xbb, 0x90, 0x89, - 0x83, 0x9a, 0xb1, 0xa8, 0xe7, 0xfe, 0xd5, 0xcc, 0x4b, 0x52, - 0x79, 0x60, 0x2f, 0x36, 0x1d, 0x04, 0x09, 0x10, 0x3b, 0x22, - 0x6d, 0x74, 0x5f, 0x46, 0xc1, 0xd8, 0xf3, 0xea, 0xa5, 0xbc, - 0x97, 0x8e, 0x84, 0x9d, 0xb6, 0xaf, 0xe0, 0xf9, 0xd2, 0xcb, - 0x4c, 0x55, 0x7e, 0x67, 0x28, 0x31, 0x1a, 0x03, 0x1c, 0x05, - 0x2e, 0x37, 0x78, 0x61, 0x4a, 0x53, 0xd4, 0xcd, 0xe6, 0xff, - 0xb0, 0xa9, 0x82, 0x9b, 0x91, 0x88, 0xa3, 0xba, 0xf5, 0xec, - 0xc7, 0xde, 0x59, 0x40, 0x6b, 0x72, 0x3d, 0x24, 0x0f, 0x16, - 0x1b, 0x02, 0x29, 0x30, 0x7f, 0x66, 0x4d, 0x54, 0xd3, 0xca, - 0xe1, 0xf8, 0xb7, 0xae, 0x85, 0x9c, 0x96, 0x8f, 0xa4, 0xbd, - 0xf2, 0xeb, 0xc0, 0xd9, 0x5e, 0x47, 0x6c, 0x75, 0x3a, 0x23, - 0x08, 0x11, 0x12, 0x0b, 0x20, 0x39, 0x76, 0x6f, 0x44, 0x5d, - 0xda, 0xc3, 0xe8, 0xf1, 0xbe, 0xa7, 0x8c, 0x95, 0x9f, 0x86, - 0xad, 0xb4, 0xfb, 0xe2, 0xc9, 0xd0, 0x57, 0x4e, 0x65, 0x7c, - 0x33, 0x2a, 0x01, 0x18, 0x15, 0x0c, 0x27, 0x3e, 0x71, 0x68, - 0x43, 0x5a, 0xdd, 0xc4, 0xef, 0xf6, 0xb9, 0xa0, 0x8b, 0x92, - 0x98, 0x81, 0xaa, 0xb3, 0xfc, 0xe5, 0xce, 0xd7, 0x50, 0x49, - 0x62, 0x7b, 0x34, 0x2d, 0x06, 0x1f, 0x00, 0x1a, 0x34, 0x2e, - 0x68, 0x72, 0x5c, 0x46, 0xd0, 0xca, 0xe4, 0xfe, 0xb8, 0xa2, - 0x8c, 0x96, 0xbd, 0xa7, 0x89, 0x93, 0xd5, 0xcf, 0xe1, 0xfb, - 0x6d, 0x77, 0x59, 0x43, 0x05, 0x1f, 0x31, 0x2b, 0x67, 0x7d, - 0x53, 0x49, 0x0f, 0x15, 0x3b, 0x21, 0xb7, 0xad, 0x83, 0x99, - 0xdf, 0xc5, 0xeb, 0xf1, 0xda, 0xc0, 0xee, 0xf4, 0xb2, 0xa8, - 0x86, 0x9c, 0x0a, 0x10, 0x3e, 0x24, 0x62, 0x78, 0x56, 0x4c, - 0xce, 0xd4, 0xfa, 0xe0, 0xa6, 0xbc, 0x92, 0x88, 0x1e, 0x04, - 0x2a, 0x30, 0x76, 0x6c, 0x42, 0x58, 0x73, 0x69, 0x47, 0x5d, - 0x1b, 0x01, 0x2f, 0x35, 0xa3, 0xb9, 0x97, 0x8d, 0xcb, 0xd1, - 0xff, 0xe5, 0xa9, 0xb3, 0x9d, 0x87, 0xc1, 0xdb, 0xf5, 0xef, - 0x79, 0x63, 0x4d, 0x57, 0x11, 0x0b, 0x25, 0x3f, 0x14, 0x0e, - 0x20, 0x3a, 0x7c, 0x66, 0x48, 0x52, 0xc4, 0xde, 0xf0, 0xea, - 0xac, 0xb6, 0x98, 0x82, 0x81, 0x9b, 0xb5, 0xaf, 0xe9, 0xf3, - 0xdd, 0xc7, 0x51, 0x4b, 0x65, 0x7f, 0x39, 0x23, 0x0d, 0x17, - 0x3c, 0x26, 0x08, 0x12, 0x54, 0x4e, 0x60, 0x7a, 0xec, 0xf6, - 0xd8, 0xc2, 0x84, 0x9e, 0xb0, 0xaa, 0xe6, 0xfc, 0xd2, 0xc8, - 0x8e, 0x94, 0xba, 0xa0, 0x36, 0x2c, 0x02, 0x18, 0x5e, 0x44, - 0x6a, 0x70, 0x5b, 0x41, 0x6f, 0x75, 0x33, 0x29, 0x07, 0x1d, - 0x8b, 0x91, 0xbf, 0xa5, 0xe3, 0xf9, 0xd7, 0xcd, 0x4f, 0x55, - 0x7b, 0x61, 0x27, 0x3d, 0x13, 0x09, 0x9f, 0x85, 0xab, 0xb1, - 0xf7, 0xed, 0xc3, 0xd9, 0xf2, 0xe8, 0xc6, 0xdc, 0x9a, 0x80, - 0xae, 0xb4, 0x22, 0x38, 0x16, 0x0c, 0x4a, 0x50, 0x7e, 0x64, - 0x28, 0x32, 0x1c, 0x06, 0x40, 0x5a, 0x74, 0x6e, 0xf8, 0xe2, - 0xcc, 0xd6, 0x90, 0x8a, 0xa4, 0xbe, 0x95, 0x8f, 0xa1, 0xbb, - 0xfd, 0xe7, 0xc9, 0xd3, 0x45, 0x5f, 0x71, 0x6b, 0x2d, 0x37, - 0x19, 0x03, 0x00, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41, - 0xd8, 0xc3, 0xee, 0xf5, 0xb4, 0xaf, 0x82, 0x99, 0xad, 0xb6, - 0x9b, 0x80, 0xc1, 0xda, 0xf7, 0xec, 0x75, 0x6e, 0x43, 0x58, - 0x19, 0x02, 0x2f, 0x34, 0x47, 0x5c, 0x71, 0x6a, 0x2b, 0x30, - 0x1d, 0x06, 0x9f, 0x84, 0xa9, 0xb2, 0xf3, 0xe8, 0xc5, 0xde, - 0xea, 0xf1, 0xdc, 0xc7, 0x86, 0x9d, 0xb0, 0xab, 0x32, 0x29, - 0x04, 0x1f, 0x5e, 0x45, 0x68, 0x73, 0x8e, 0x95, 0xb8, 0xa3, - 0xe2, 0xf9, 0xd4, 0xcf, 0x56, 0x4d, 0x60, 0x7b, 0x3a, 0x21, - 0x0c, 0x17, 0x23, 0x38, 0x15, 0x0e, 0x4f, 0x54, 0x79, 0x62, - 0xfb, 0xe0, 0xcd, 0xd6, 0x97, 0x8c, 0xa1, 0xba, 0xc9, 0xd2, - 0xff, 0xe4, 0xa5, 0xbe, 0x93, 0x88, 0x11, 0x0a, 0x27, 0x3c, - 0x7d, 0x66, 0x4b, 0x50, 0x64, 0x7f, 0x52, 0x49, 0x08, 0x13, - 0x3e, 0x25, 0xbc, 0xa7, 0x8a, 0x91, 0xd0, 0xcb, 0xe6, 0xfd, - 0x01, 0x1a, 0x37, 0x2c, 0x6d, 0x76, 0x5b, 0x40, 0xd9, 0xc2, - 0xef, 0xf4, 0xb5, 0xae, 0x83, 0x98, 0xac, 0xb7, 0x9a, 0x81, - 0xc0, 0xdb, 0xf6, 0xed, 0x74, 0x6f, 0x42, 0x59, 0x18, 0x03, - 0x2e, 0x35, 0x46, 0x5d, 0x70, 0x6b, 0x2a, 0x31, 0x1c, 0x07, - 0x9e, 0x85, 0xa8, 0xb3, 0xf2, 0xe9, 0xc4, 0xdf, 0xeb, 0xf0, - 0xdd, 0xc6, 0x87, 0x9c, 0xb1, 0xaa, 0x33, 0x28, 0x05, 0x1e, - 0x5f, 0x44, 0x69, 0x72, 0x8f, 0x94, 0xb9, 0xa2, 0xe3, 0xf8, - 0xd5, 0xce, 0x57, 0x4c, 0x61, 0x7a, 0x3b, 0x20, 0x0d, 0x16, - 0x22, 0x39, 0x14, 0x0f, 0x4e, 0x55, 0x78, 0x63, 0xfa, 0xe1, - 0xcc, 0xd7, 0x96, 0x8d, 0xa0, 0xbb, 0xc8, 0xd3, 0xfe, 0xe5, - 0xa4, 0xbf, 0x92, 0x89, 0x10, 0x0b, 0x26, 0x3d, 0x7c, 0x67, - 0x4a, 0x51, 0x65, 0x7e, 0x53, 0x48, 0x09, 0x12, 0x3f, 0x24, - 0xbd, 0xa6, 0x8b, 0x90, 0xd1, 0xca, 0xe7, 0xfc, 0x00, 0x1c, - 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, 0xe0, 0xfc, 0xd8, 0xc4, - 0x90, 0x8c, 0xa8, 0xb4, 0xdd, 0xc1, 0xe5, 0xf9, 0xad, 0xb1, - 0x95, 0x89, 0x3d, 0x21, 0x05, 0x19, 0x4d, 0x51, 0x75, 0x69, - 0xa7, 0xbb, 0x9f, 0x83, 0xd7, 0xcb, 0xef, 0xf3, 0x47, 0x5b, - 0x7f, 0x63, 0x37, 0x2b, 0x0f, 0x13, 0x7a, 0x66, 0x42, 0x5e, - 0x0a, 0x16, 0x32, 0x2e, 0x9a, 0x86, 0xa2, 0xbe, 0xea, 0xf6, - 0xd2, 0xce, 0x53, 0x4f, 0x6b, 0x77, 0x23, 0x3f, 0x1b, 0x07, - 0xb3, 0xaf, 0x8b, 0x97, 0xc3, 0xdf, 0xfb, 0xe7, 0x8e, 0x92, - 0xb6, 0xaa, 0xfe, 0xe2, 0xc6, 0xda, 0x6e, 0x72, 0x56, 0x4a, - 0x1e, 0x02, 0x26, 0x3a, 0xf4, 0xe8, 0xcc, 0xd0, 0x84, 0x98, - 0xbc, 0xa0, 0x14, 0x08, 0x2c, 0x30, 0x64, 0x78, 0x5c, 0x40, - 0x29, 0x35, 0x11, 0x0d, 0x59, 0x45, 0x61, 0x7d, 0xc9, 0xd5, - 0xf1, 0xed, 0xb9, 0xa5, 0x81, 0x9d, 0xa6, 0xba, 0x9e, 0x82, - 0xd6, 0xca, 0xee, 0xf2, 0x46, 0x5a, 0x7e, 0x62, 0x36, 0x2a, - 0x0e, 0x12, 0x7b, 0x67, 0x43, 0x5f, 0x0b, 0x17, 0x33, 0x2f, - 0x9b, 0x87, 0xa3, 0xbf, 0xeb, 0xf7, 0xd3, 0xcf, 0x01, 0x1d, - 0x39, 0x25, 0x71, 0x6d, 0x49, 0x55, 0xe1, 0xfd, 0xd9, 0xc5, - 0x91, 0x8d, 0xa9, 0xb5, 0xdc, 0xc0, 0xe4, 0xf8, 0xac, 0xb0, - 0x94, 0x88, 0x3c, 0x20, 0x04, 0x18, 0x4c, 0x50, 0x74, 0x68, - 0xf5, 0xe9, 0xcd, 0xd1, 0x85, 0x99, 0xbd, 0xa1, 0x15, 0x09, - 0x2d, 0x31, 0x65, 0x79, 0x5d, 0x41, 0x28, 0x34, 0x10, 0x0c, - 0x58, 0x44, 0x60, 0x7c, 0xc8, 0xd4, 0xf0, 0xec, 0xb8, 0xa4, - 0x80, 0x9c, 0x52, 0x4e, 0x6a, 0x76, 0x22, 0x3e, 0x1a, 0x06, - 0xb2, 0xae, 0x8a, 0x96, 0xc2, 0xde, 0xfa, 0xe6, 0x8f, 0x93, - 0xb7, 0xab, 0xff, 0xe3, 0xc7, 0xdb, 0x6f, 0x73, 0x57, 0x4b, - 0x1f, 0x03, 0x27, 0x3b, 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, - 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, - 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, - 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, - 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, - 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, - 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, - 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, - 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, - 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, - 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, - 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, - 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, - 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, - 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, - 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, - 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, - 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, - 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, - 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, - 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, - 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, - 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, - 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, - 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, - 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4, - 0x00, 0x1e, 0x3c, 0x22, 0x78, 0x66, 0x44, 0x5a, 0xf0, 0xee, - 0xcc, 0xd2, 0x88, 0x96, 0xb4, 0xaa, 0xfd, 0xe3, 0xc1, 0xdf, - 0x85, 0x9b, 0xb9, 0xa7, 0x0d, 0x13, 0x31, 0x2f, 0x75, 0x6b, - 0x49, 0x57, 0xe7, 0xf9, 0xdb, 0xc5, 0x9f, 0x81, 0xa3, 0xbd, - 0x17, 0x09, 0x2b, 0x35, 0x6f, 0x71, 0x53, 0x4d, 0x1a, 0x04, - 0x26, 0x38, 0x62, 0x7c, 0x5e, 0x40, 0xea, 0xf4, 0xd6, 0xc8, - 0x92, 0x8c, 0xae, 0xb0, 0xd3, 0xcd, 0xef, 0xf1, 0xab, 0xb5, - 0x97, 0x89, 0x23, 0x3d, 0x1f, 0x01, 0x5b, 0x45, 0x67, 0x79, - 0x2e, 0x30, 0x12, 0x0c, 0x56, 0x48, 0x6a, 0x74, 0xde, 0xc0, - 0xe2, 0xfc, 0xa6, 0xb8, 0x9a, 0x84, 0x34, 0x2a, 0x08, 0x16, - 0x4c, 0x52, 0x70, 0x6e, 0xc4, 0xda, 0xf8, 0xe6, 0xbc, 0xa2, - 0x80, 0x9e, 0xc9, 0xd7, 0xf5, 0xeb, 0xb1, 0xaf, 0x8d, 0x93, - 0x39, 0x27, 0x05, 0x1b, 0x41, 0x5f, 0x7d, 0x63, 0xbb, 0xa5, - 0x87, 0x99, 0xc3, 0xdd, 0xff, 0xe1, 0x4b, 0x55, 0x77, 0x69, - 0x33, 0x2d, 0x0f, 0x11, 0x46, 0x58, 0x7a, 0x64, 0x3e, 0x20, - 0x02, 0x1c, 0xb6, 0xa8, 0x8a, 0x94, 0xce, 0xd0, 0xf2, 0xec, - 0x5c, 0x42, 0x60, 0x7e, 0x24, 0x3a, 0x18, 0x06, 0xac, 0xb2, - 0x90, 0x8e, 0xd4, 0xca, 0xe8, 0xf6, 0xa1, 0xbf, 0x9d, 0x83, - 0xd9, 0xc7, 0xe5, 0xfb, 0x51, 0x4f, 0x6d, 0x73, 0x29, 0x37, - 0x15, 0x0b, 0x68, 0x76, 0x54, 0x4a, 0x10, 0x0e, 0x2c, 0x32, - 0x98, 0x86, 0xa4, 0xba, 0xe0, 0xfe, 0xdc, 0xc2, 0x95, 0x8b, - 0xa9, 0xb7, 0xed, 0xf3, 0xd1, 0xcf, 0x65, 0x7b, 0x59, 0x47, - 0x1d, 0x03, 0x21, 0x3f, 0x8f, 0x91, 0xb3, 0xad, 0xf7, 0xe9, - 0xcb, 0xd5, 0x7f, 0x61, 0x43, 0x5d, 0x07, 0x19, 0x3b, 0x25, - 0x72, 0x6c, 0x4e, 0x50, 0x0a, 0x14, 0x36, 0x28, 0x82, 0x9c, - 0xbe, 0xa0, 0xfa, 0xe4, 0xc6, 0xd8, 0x00, 0x1f, 0x3e, 0x21, - 0x7c, 0x63, 0x42, 0x5d, 0xf8, 0xe7, 0xc6, 0xd9, 0x84, 0x9b, - 0xba, 0xa5, 0xed, 0xf2, 0xd3, 0xcc, 0x91, 0x8e, 0xaf, 0xb0, - 0x15, 0x0a, 0x2b, 0x34, 0x69, 0x76, 0x57, 0x48, 0xc7, 0xd8, - 0xf9, 0xe6, 0xbb, 0xa4, 0x85, 0x9a, 0x3f, 0x20, 0x01, 0x1e, - 0x43, 0x5c, 0x7d, 0x62, 0x2a, 0x35, 0x14, 0x0b, 0x56, 0x49, - 0x68, 0x77, 0xd2, 0xcd, 0xec, 0xf3, 0xae, 0xb1, 0x90, 0x8f, - 0x93, 0x8c, 0xad, 0xb2, 0xef, 0xf0, 0xd1, 0xce, 0x6b, 0x74, - 0x55, 0x4a, 0x17, 0x08, 0x29, 0x36, 0x7e, 0x61, 0x40, 0x5f, - 0x02, 0x1d, 0x3c, 0x23, 0x86, 0x99, 0xb8, 0xa7, 0xfa, 0xe5, - 0xc4, 0xdb, 0x54, 0x4b, 0x6a, 0x75, 0x28, 0x37, 0x16, 0x09, - 0xac, 0xb3, 0x92, 0x8d, 0xd0, 0xcf, 0xee, 0xf1, 0xb9, 0xa6, - 0x87, 0x98, 0xc5, 0xda, 0xfb, 0xe4, 0x41, 0x5e, 0x7f, 0x60, - 0x3d, 0x22, 0x03, 0x1c, 0x3b, 0x24, 0x05, 0x1a, 0x47, 0x58, - 0x79, 0x66, 0xc3, 0xdc, 0xfd, 0xe2, 0xbf, 0xa0, 0x81, 0x9e, - 0xd6, 0xc9, 0xe8, 0xf7, 0xaa, 0xb5, 0x94, 0x8b, 0x2e, 0x31, - 0x10, 0x0f, 0x52, 0x4d, 0x6c, 0x73, 0xfc, 0xe3, 0xc2, 0xdd, - 0x80, 0x9f, 0xbe, 0xa1, 0x04, 0x1b, 0x3a, 0x25, 0x78, 0x67, - 0x46, 0x59, 0x11, 0x0e, 0x2f, 0x30, 0x6d, 0x72, 0x53, 0x4c, - 0xe9, 0xf6, 0xd7, 0xc8, 0x95, 0x8a, 0xab, 0xb4, 0xa8, 0xb7, - 0x96, 0x89, 0xd4, 0xcb, 0xea, 0xf5, 0x50, 0x4f, 0x6e, 0x71, - 0x2c, 0x33, 0x12, 0x0d, 0x45, 0x5a, 0x7b, 0x64, 0x39, 0x26, - 0x07, 0x18, 0xbd, 0xa2, 0x83, 0x9c, 0xc1, 0xde, 0xff, 0xe0, - 0x6f, 0x70, 0x51, 0x4e, 0x13, 0x0c, 0x2d, 0x32, 0x97, 0x88, - 0xa9, 0xb6, 0xeb, 0xf4, 0xd5, 0xca, 0x82, 0x9d, 0xbc, 0xa3, - 0xfe, 0xe1, 0xc0, 0xdf, 0x7a, 0x65, 0x44, 0x5b, 0x06, 0x19, - 0x38, 0x27, 0x00, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, - 0x1d, 0x3d, 0x5d, 0x7d, 0x9d, 0xbd, 0xdd, 0xfd, 0x3a, 0x1a, - 0x7a, 0x5a, 0xba, 0x9a, 0xfa, 0xda, 0x27, 0x07, 0x67, 0x47, - 0xa7, 0x87, 0xe7, 0xc7, 0x74, 0x54, 0x34, 0x14, 0xf4, 0xd4, - 0xb4, 0x94, 0x69, 0x49, 0x29, 0x09, 0xe9, 0xc9, 0xa9, 0x89, - 0x4e, 0x6e, 0x0e, 0x2e, 0xce, 0xee, 0x8e, 0xae, 0x53, 0x73, - 0x13, 0x33, 0xd3, 0xf3, 0x93, 0xb3, 0xe8, 0xc8, 0xa8, 0x88, - 0x68, 0x48, 0x28, 0x08, 0xf5, 0xd5, 0xb5, 0x95, 0x75, 0x55, - 0x35, 0x15, 0xd2, 0xf2, 0x92, 0xb2, 0x52, 0x72, 0x12, 0x32, - 0xcf, 0xef, 0x8f, 0xaf, 0x4f, 0x6f, 0x0f, 0x2f, 0x9c, 0xbc, - 0xdc, 0xfc, 0x1c, 0x3c, 0x5c, 0x7c, 0x81, 0xa1, 0xc1, 0xe1, - 0x01, 0x21, 0x41, 0x61, 0xa6, 0x86, 0xe6, 0xc6, 0x26, 0x06, - 0x66, 0x46, 0xbb, 0x9b, 0xfb, 0xdb, 0x3b, 0x1b, 0x7b, 0x5b, - 0xcd, 0xed, 0x8d, 0xad, 0x4d, 0x6d, 0x0d, 0x2d, 0xd0, 0xf0, - 0x90, 0xb0, 0x50, 0x70, 0x10, 0x30, 0xf7, 0xd7, 0xb7, 0x97, - 0x77, 0x57, 0x37, 0x17, 0xea, 0xca, 0xaa, 0x8a, 0x6a, 0x4a, - 0x2a, 0x0a, 0xb9, 0x99, 0xf9, 0xd9, 0x39, 0x19, 0x79, 0x59, - 0xa4, 0x84, 0xe4, 0xc4, 0x24, 0x04, 0x64, 0x44, 0x83, 0xa3, - 0xc3, 0xe3, 0x03, 0x23, 0x43, 0x63, 0x9e, 0xbe, 0xde, 0xfe, - 0x1e, 0x3e, 0x5e, 0x7e, 0x25, 0x05, 0x65, 0x45, 0xa5, 0x85, - 0xe5, 0xc5, 0x38, 0x18, 0x78, 0x58, 0xb8, 0x98, 0xf8, 0xd8, - 0x1f, 0x3f, 0x5f, 0x7f, 0x9f, 0xbf, 0xdf, 0xff, 0x02, 0x22, - 0x42, 0x62, 0x82, 0xa2, 0xc2, 0xe2, 0x51, 0x71, 0x11, 0x31, - 0xd1, 0xf1, 0x91, 0xb1, 0x4c, 0x6c, 0x0c, 0x2c, 0xcc, 0xec, - 0x8c, 0xac, 0x6b, 0x4b, 0x2b, 0x0b, 0xeb, 0xcb, 0xab, 0x8b, - 0x76, 0x56, 0x36, 0x16, 0xf6, 0xd6, 0xb6, 0x96, 0x00, 0x21, - 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x15, 0x34, 0x57, 0x76, - 0x91, 0xb0, 0xd3, 0xf2, 0x2a, 0x0b, 0x68, 0x49, 0xae, 0x8f, - 0xec, 0xcd, 0x3f, 0x1e, 0x7d, 0x5c, 0xbb, 0x9a, 0xf9, 0xd8, - 0x54, 0x75, 0x16, 0x37, 0xd0, 0xf1, 0x92, 0xb3, 0x41, 0x60, - 0x03, 0x22, 0xc5, 0xe4, 0x87, 0xa6, 0x7e, 0x5f, 0x3c, 0x1d, - 0xfa, 0xdb, 0xb8, 0x99, 0x6b, 0x4a, 0x29, 0x08, 0xef, 0xce, - 0xad, 0x8c, 0xa8, 0x89, 0xea, 0xcb, 0x2c, 0x0d, 0x6e, 0x4f, - 0xbd, 0x9c, 0xff, 0xde, 0x39, 0x18, 0x7b, 0x5a, 0x82, 0xa3, - 0xc0, 0xe1, 0x06, 0x27, 0x44, 0x65, 0x97, 0xb6, 0xd5, 0xf4, - 0x13, 0x32, 0x51, 0x70, 0xfc, 0xdd, 0xbe, 0x9f, 0x78, 0x59, - 0x3a, 0x1b, 0xe9, 0xc8, 0xab, 0x8a, 0x6d, 0x4c, 0x2f, 0x0e, - 0xd6, 0xf7, 0x94, 0xb5, 0x52, 0x73, 0x10, 0x31, 0xc3, 0xe2, - 0x81, 0xa0, 0x47, 0x66, 0x05, 0x24, 0x4d, 0x6c, 0x0f, 0x2e, - 0xc9, 0xe8, 0x8b, 0xaa, 0x58, 0x79, 0x1a, 0x3b, 0xdc, 0xfd, - 0x9e, 0xbf, 0x67, 0x46, 0x25, 0x04, 0xe3, 0xc2, 0xa1, 0x80, - 0x72, 0x53, 0x30, 0x11, 0xf6, 0xd7, 0xb4, 0x95, 0x19, 0x38, - 0x5b, 0x7a, 0x9d, 0xbc, 0xdf, 0xfe, 0x0c, 0x2d, 0x4e, 0x6f, - 0x88, 0xa9, 0xca, 0xeb, 0x33, 0x12, 0x71, 0x50, 0xb7, 0x96, - 0xf5, 0xd4, 0x26, 0x07, 0x64, 0x45, 0xa2, 0x83, 0xe0, 0xc1, - 0xe5, 0xc4, 0xa7, 0x86, 0x61, 0x40, 0x23, 0x02, 0xf0, 0xd1, - 0xb2, 0x93, 0x74, 0x55, 0x36, 0x17, 0xcf, 0xee, 0x8d, 0xac, - 0x4b, 0x6a, 0x09, 0x28, 0xda, 0xfb, 0x98, 0xb9, 0x5e, 0x7f, - 0x1c, 0x3d, 0xb1, 0x90, 0xf3, 0xd2, 0x35, 0x14, 0x77, 0x56, - 0xa4, 0x85, 0xe6, 0xc7, 0x20, 0x01, 0x62, 0x43, 0x9b, 0xba, - 0xd9, 0xf8, 0x1f, 0x3e, 0x5d, 0x7c, 0x8e, 0xaf, 0xcc, 0xed, - 0x0a, 0x2b, 0x48, 0x69, 0x00, 0x22, 0x44, 0x66, 0x88, 0xaa, - 0xcc, 0xee, 0x0d, 0x2f, 0x49, 0x6b, 0x85, 0xa7, 0xc1, 0xe3, - 0x1a, 0x38, 0x5e, 0x7c, 0x92, 0xb0, 0xd6, 0xf4, 0x17, 0x35, - 0x53, 0x71, 0x9f, 0xbd, 0xdb, 0xf9, 0x34, 0x16, 0x70, 0x52, - 0xbc, 0x9e, 0xf8, 0xda, 0x39, 0x1b, 0x7d, 0x5f, 0xb1, 0x93, - 0xf5, 0xd7, 0x2e, 0x0c, 0x6a, 0x48, 0xa6, 0x84, 0xe2, 0xc0, - 0x23, 0x01, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd, 0x68, 0x4a, - 0x2c, 0x0e, 0xe0, 0xc2, 0xa4, 0x86, 0x65, 0x47, 0x21, 0x03, - 0xed, 0xcf, 0xa9, 0x8b, 0x72, 0x50, 0x36, 0x14, 0xfa, 0xd8, - 0xbe, 0x9c, 0x7f, 0x5d, 0x3b, 0x19, 0xf7, 0xd5, 0xb3, 0x91, - 0x5c, 0x7e, 0x18, 0x3a, 0xd4, 0xf6, 0x90, 0xb2, 0x51, 0x73, - 0x15, 0x37, 0xd9, 0xfb, 0x9d, 0xbf, 0x46, 0x64, 0x02, 0x20, - 0xce, 0xec, 0x8a, 0xa8, 0x4b, 0x69, 0x0f, 0x2d, 0xc3, 0xe1, - 0x87, 0xa5, 0xd0, 0xf2, 0x94, 0xb6, 0x58, 0x7a, 0x1c, 0x3e, - 0xdd, 0xff, 0x99, 0xbb, 0x55, 0x77, 0x11, 0x33, 0xca, 0xe8, - 0x8e, 0xac, 0x42, 0x60, 0x06, 0x24, 0xc7, 0xe5, 0x83, 0xa1, - 0x4f, 0x6d, 0x0b, 0x29, 0xe4, 0xc6, 0xa0, 0x82, 0x6c, 0x4e, - 0x28, 0x0a, 0xe9, 0xcb, 0xad, 0x8f, 0x61, 0x43, 0x25, 0x07, - 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0xf3, 0xd1, - 0xb7, 0x95, 0x7b, 0x59, 0x3f, 0x1d, 0xb8, 0x9a, 0xfc, 0xde, - 0x30, 0x12, 0x74, 0x56, 0xb5, 0x97, 0xf1, 0xd3, 0x3d, 0x1f, - 0x79, 0x5b, 0xa2, 0x80, 0xe6, 0xc4, 0x2a, 0x08, 0x6e, 0x4c, - 0xaf, 0x8d, 0xeb, 0xc9, 0x27, 0x05, 0x63, 0x41, 0x8c, 0xae, - 0xc8, 0xea, 0x04, 0x26, 0x40, 0x62, 0x81, 0xa3, 0xc5, 0xe7, - 0x09, 0x2b, 0x4d, 0x6f, 0x96, 0xb4, 0xd2, 0xf0, 0x1e, 0x3c, - 0x5a, 0x78, 0x9b, 0xb9, 0xdf, 0xfd, 0x13, 0x31, 0x57, 0x75, - 0x00, 0x23, 0x46, 0x65, 0x8c, 0xaf, 0xca, 0xe9, 0x05, 0x26, - 0x43, 0x60, 0x89, 0xaa, 0xcf, 0xec, 0x0a, 0x29, 0x4c, 0x6f, - 0x86, 0xa5, 0xc0, 0xe3, 0x0f, 0x2c, 0x49, 0x6a, 0x83, 0xa0, - 0xc5, 0xe6, 0x14, 0x37, 0x52, 0x71, 0x98, 0xbb, 0xde, 0xfd, - 0x11, 0x32, 0x57, 0x74, 0x9d, 0xbe, 0xdb, 0xf8, 0x1e, 0x3d, - 0x58, 0x7b, 0x92, 0xb1, 0xd4, 0xf7, 0x1b, 0x38, 0x5d, 0x7e, - 0x97, 0xb4, 0xd1, 0xf2, 0x28, 0x0b, 0x6e, 0x4d, 0xa4, 0x87, - 0xe2, 0xc1, 0x2d, 0x0e, 0x6b, 0x48, 0xa1, 0x82, 0xe7, 0xc4, - 0x22, 0x01, 0x64, 0x47, 0xae, 0x8d, 0xe8, 0xcb, 0x27, 0x04, - 0x61, 0x42, 0xab, 0x88, 0xed, 0xce, 0x3c, 0x1f, 0x7a, 0x59, - 0xb0, 0x93, 0xf6, 0xd5, 0x39, 0x1a, 0x7f, 0x5c, 0xb5, 0x96, - 0xf3, 0xd0, 0x36, 0x15, 0x70, 0x53, 0xba, 0x99, 0xfc, 0xdf, - 0x33, 0x10, 0x75, 0x56, 0xbf, 0x9c, 0xf9, 0xda, 0x50, 0x73, - 0x16, 0x35, 0xdc, 0xff, 0x9a, 0xb9, 0x55, 0x76, 0x13, 0x30, - 0xd9, 0xfa, 0x9f, 0xbc, 0x5a, 0x79, 0x1c, 0x3f, 0xd6, 0xf5, - 0x90, 0xb3, 0x5f, 0x7c, 0x19, 0x3a, 0xd3, 0xf0, 0x95, 0xb6, - 0x44, 0x67, 0x02, 0x21, 0xc8, 0xeb, 0x8e, 0xad, 0x41, 0x62, - 0x07, 0x24, 0xcd, 0xee, 0x8b, 0xa8, 0x4e, 0x6d, 0x08, 0x2b, - 0xc2, 0xe1, 0x84, 0xa7, 0x4b, 0x68, 0x0d, 0x2e, 0xc7, 0xe4, - 0x81, 0xa2, 0x78, 0x5b, 0x3e, 0x1d, 0xf4, 0xd7, 0xb2, 0x91, - 0x7d, 0x5e, 0x3b, 0x18, 0xf1, 0xd2, 0xb7, 0x94, 0x72, 0x51, - 0x34, 0x17, 0xfe, 0xdd, 0xb8, 0x9b, 0x77, 0x54, 0x31, 0x12, - 0xfb, 0xd8, 0xbd, 0x9e, 0x6c, 0x4f, 0x2a, 0x09, 0xe0, 0xc3, - 0xa6, 0x85, 0x69, 0x4a, 0x2f, 0x0c, 0xe5, 0xc6, 0xa3, 0x80, - 0x66, 0x45, 0x20, 0x03, 0xea, 0xc9, 0xac, 0x8f, 0x63, 0x40, - 0x25, 0x06, 0xef, 0xcc, 0xa9, 0x8a, 0x00, 0x24, 0x48, 0x6c, - 0x90, 0xb4, 0xd8, 0xfc, 0x3d, 0x19, 0x75, 0x51, 0xad, 0x89, - 0xe5, 0xc1, 0x7a, 0x5e, 0x32, 0x16, 0xea, 0xce, 0xa2, 0x86, - 0x47, 0x63, 0x0f, 0x2b, 0xd7, 0xf3, 0x9f, 0xbb, 0xf4, 0xd0, - 0xbc, 0x98, 0x64, 0x40, 0x2c, 0x08, 0xc9, 0xed, 0x81, 0xa5, - 0x59, 0x7d, 0x11, 0x35, 0x8e, 0xaa, 0xc6, 0xe2, 0x1e, 0x3a, - 0x56, 0x72, 0xb3, 0x97, 0xfb, 0xdf, 0x23, 0x07, 0x6b, 0x4f, - 0xf5, 0xd1, 0xbd, 0x99, 0x65, 0x41, 0x2d, 0x09, 0xc8, 0xec, - 0x80, 0xa4, 0x58, 0x7c, 0x10, 0x34, 0x8f, 0xab, 0xc7, 0xe3, - 0x1f, 0x3b, 0x57, 0x73, 0xb2, 0x96, 0xfa, 0xde, 0x22, 0x06, - 0x6a, 0x4e, 0x01, 0x25, 0x49, 0x6d, 0x91, 0xb5, 0xd9, 0xfd, - 0x3c, 0x18, 0x74, 0x50, 0xac, 0x88, 0xe4, 0xc0, 0x7b, 0x5f, - 0x33, 0x17, 0xeb, 0xcf, 0xa3, 0x87, 0x46, 0x62, 0x0e, 0x2a, - 0xd6, 0xf2, 0x9e, 0xba, 0xf7, 0xd3, 0xbf, 0x9b, 0x67, 0x43, - 0x2f, 0x0b, 0xca, 0xee, 0x82, 0xa6, 0x5a, 0x7e, 0x12, 0x36, - 0x8d, 0xa9, 0xc5, 0xe1, 0x1d, 0x39, 0x55, 0x71, 0xb0, 0x94, - 0xf8, 0xdc, 0x20, 0x04, 0x68, 0x4c, 0x03, 0x27, 0x4b, 0x6f, - 0x93, 0xb7, 0xdb, 0xff, 0x3e, 0x1a, 0x76, 0x52, 0xae, 0x8a, - 0xe6, 0xc2, 0x79, 0x5d, 0x31, 0x15, 0xe9, 0xcd, 0xa1, 0x85, - 0x44, 0x60, 0x0c, 0x28, 0xd4, 0xf0, 0x9c, 0xb8, 0x02, 0x26, - 0x4a, 0x6e, 0x92, 0xb6, 0xda, 0xfe, 0x3f, 0x1b, 0x77, 0x53, - 0xaf, 0x8b, 0xe7, 0xc3, 0x78, 0x5c, 0x30, 0x14, 0xe8, 0xcc, - 0xa0, 0x84, 0x45, 0x61, 0x0d, 0x29, 0xd5, 0xf1, 0x9d, 0xb9, - 0xf6, 0xd2, 0xbe, 0x9a, 0x66, 0x42, 0x2e, 0x0a, 0xcb, 0xef, - 0x83, 0xa7, 0x5b, 0x7f, 0x13, 0x37, 0x8c, 0xa8, 0xc4, 0xe0, - 0x1c, 0x38, 0x54, 0x70, 0xb1, 0x95, 0xf9, 0xdd, 0x21, 0x05, - 0x69, 0x4d, 0x00, 0x25, 0x4a, 0x6f, 0x94, 0xb1, 0xde, 0xfb, - 0x35, 0x10, 0x7f, 0x5a, 0xa1, 0x84, 0xeb, 0xce, 0x6a, 0x4f, - 0x20, 0x05, 0xfe, 0xdb, 0xb4, 0x91, 0x5f, 0x7a, 0x15, 0x30, - 0xcb, 0xee, 0x81, 0xa4, 0xd4, 0xf1, 0x9e, 0xbb, 0x40, 0x65, - 0x0a, 0x2f, 0xe1, 0xc4, 0xab, 0x8e, 0x75, 0x50, 0x3f, 0x1a, - 0xbe, 0x9b, 0xf4, 0xd1, 0x2a, 0x0f, 0x60, 0x45, 0x8b, 0xae, - 0xc1, 0xe4, 0x1f, 0x3a, 0x55, 0x70, 0xb5, 0x90, 0xff, 0xda, - 0x21, 0x04, 0x6b, 0x4e, 0x80, 0xa5, 0xca, 0xef, 0x14, 0x31, - 0x5e, 0x7b, 0xdf, 0xfa, 0x95, 0xb0, 0x4b, 0x6e, 0x01, 0x24, - 0xea, 0xcf, 0xa0, 0x85, 0x7e, 0x5b, 0x34, 0x11, 0x61, 0x44, - 0x2b, 0x0e, 0xf5, 0xd0, 0xbf, 0x9a, 0x54, 0x71, 0x1e, 0x3b, - 0xc0, 0xe5, 0x8a, 0xaf, 0x0b, 0x2e, 0x41, 0x64, 0x9f, 0xba, - 0xd5, 0xf0, 0x3e, 0x1b, 0x74, 0x51, 0xaa, 0x8f, 0xe0, 0xc5, - 0x77, 0x52, 0x3d, 0x18, 0xe3, 0xc6, 0xa9, 0x8c, 0x42, 0x67, - 0x08, 0x2d, 0xd6, 0xf3, 0x9c, 0xb9, 0x1d, 0x38, 0x57, 0x72, - 0x89, 0xac, 0xc3, 0xe6, 0x28, 0x0d, 0x62, 0x47, 0xbc, 0x99, - 0xf6, 0xd3, 0xa3, 0x86, 0xe9, 0xcc, 0x37, 0x12, 0x7d, 0x58, - 0x96, 0xb3, 0xdc, 0xf9, 0x02, 0x27, 0x48, 0x6d, 0xc9, 0xec, - 0x83, 0xa6, 0x5d, 0x78, 0x17, 0x32, 0xfc, 0xd9, 0xb6, 0x93, - 0x68, 0x4d, 0x22, 0x07, 0xc2, 0xe7, 0x88, 0xad, 0x56, 0x73, - 0x1c, 0x39, 0xf7, 0xd2, 0xbd, 0x98, 0x63, 0x46, 0x29, 0x0c, - 0xa8, 0x8d, 0xe2, 0xc7, 0x3c, 0x19, 0x76, 0x53, 0x9d, 0xb8, - 0xd7, 0xf2, 0x09, 0x2c, 0x43, 0x66, 0x16, 0x33, 0x5c, 0x79, - 0x82, 0xa7, 0xc8, 0xed, 0x23, 0x06, 0x69, 0x4c, 0xb7, 0x92, - 0xfd, 0xd8, 0x7c, 0x59, 0x36, 0x13, 0xe8, 0xcd, 0xa2, 0x87, - 0x49, 0x6c, 0x03, 0x26, 0xdd, 0xf8, 0x97, 0xb2, 0x00, 0x26, - 0x4c, 0x6a, 0x98, 0xbe, 0xd4, 0xf2, 0x2d, 0x0b, 0x61, 0x47, - 0xb5, 0x93, 0xf9, 0xdf, 0x5a, 0x7c, 0x16, 0x30, 0xc2, 0xe4, - 0x8e, 0xa8, 0x77, 0x51, 0x3b, 0x1d, 0xef, 0xc9, 0xa3, 0x85, - 0xb4, 0x92, 0xf8, 0xde, 0x2c, 0x0a, 0x60, 0x46, 0x99, 0xbf, - 0xd5, 0xf3, 0x01, 0x27, 0x4d, 0x6b, 0xee, 0xc8, 0xa2, 0x84, - 0x76, 0x50, 0x3a, 0x1c, 0xc3, 0xe5, 0x8f, 0xa9, 0x5b, 0x7d, - 0x17, 0x31, 0x75, 0x53, 0x39, 0x1f, 0xed, 0xcb, 0xa1, 0x87, - 0x58, 0x7e, 0x14, 0x32, 0xc0, 0xe6, 0x8c, 0xaa, 0x2f, 0x09, - 0x63, 0x45, 0xb7, 0x91, 0xfb, 0xdd, 0x02, 0x24, 0x4e, 0x68, - 0x9a, 0xbc, 0xd6, 0xf0, 0xc1, 0xe7, 0x8d, 0xab, 0x59, 0x7f, - 0x15, 0x33, 0xec, 0xca, 0xa0, 0x86, 0x74, 0x52, 0x38, 0x1e, - 0x9b, 0xbd, 0xd7, 0xf1, 0x03, 0x25, 0x4f, 0x69, 0xb6, 0x90, - 0xfa, 0xdc, 0x2e, 0x08, 0x62, 0x44, 0xea, 0xcc, 0xa6, 0x80, - 0x72, 0x54, 0x3e, 0x18, 0xc7, 0xe1, 0x8b, 0xad, 0x5f, 0x79, - 0x13, 0x35, 0xb0, 0x96, 0xfc, 0xda, 0x28, 0x0e, 0x64, 0x42, - 0x9d, 0xbb, 0xd1, 0xf7, 0x05, 0x23, 0x49, 0x6f, 0x5e, 0x78, - 0x12, 0x34, 0xc6, 0xe0, 0x8a, 0xac, 0x73, 0x55, 0x3f, 0x19, - 0xeb, 0xcd, 0xa7, 0x81, 0x04, 0x22, 0x48, 0x6e, 0x9c, 0xba, - 0xd0, 0xf6, 0x29, 0x0f, 0x65, 0x43, 0xb1, 0x97, 0xfd, 0xdb, - 0x9f, 0xb9, 0xd3, 0xf5, 0x07, 0x21, 0x4b, 0x6d, 0xb2, 0x94, - 0xfe, 0xd8, 0x2a, 0x0c, 0x66, 0x40, 0xc5, 0xe3, 0x89, 0xaf, - 0x5d, 0x7b, 0x11, 0x37, 0xe8, 0xce, 0xa4, 0x82, 0x70, 0x56, - 0x3c, 0x1a, 0x2b, 0x0d, 0x67, 0x41, 0xb3, 0x95, 0xff, 0xd9, - 0x06, 0x20, 0x4a, 0x6c, 0x9e, 0xb8, 0xd2, 0xf4, 0x71, 0x57, - 0x3d, 0x1b, 0xe9, 0xcf, 0xa5, 0x83, 0x5c, 0x7a, 0x10, 0x36, - 0xc4, 0xe2, 0x88, 0xae, 0x00, 0x27, 0x4e, 0x69, 0x9c, 0xbb, - 0xd2, 0xf5, 0x25, 0x02, 0x6b, 0x4c, 0xb9, 0x9e, 0xf7, 0xd0, - 0x4a, 0x6d, 0x04, 0x23, 0xd6, 0xf1, 0x98, 0xbf, 0x6f, 0x48, - 0x21, 0x06, 0xf3, 0xd4, 0xbd, 0x9a, 0x94, 0xb3, 0xda, 0xfd, - 0x08, 0x2f, 0x46, 0x61, 0xb1, 0x96, 0xff, 0xd8, 0x2d, 0x0a, - 0x63, 0x44, 0xde, 0xf9, 0x90, 0xb7, 0x42, 0x65, 0x0c, 0x2b, - 0xfb, 0xdc, 0xb5, 0x92, 0x67, 0x40, 0x29, 0x0e, 0x35, 0x12, - 0x7b, 0x5c, 0xa9, 0x8e, 0xe7, 0xc0, 0x10, 0x37, 0x5e, 0x79, - 0x8c, 0xab, 0xc2, 0xe5, 0x7f, 0x58, 0x31, 0x16, 0xe3, 0xc4, - 0xad, 0x8a, 0x5a, 0x7d, 0x14, 0x33, 0xc6, 0xe1, 0x88, 0xaf, - 0xa1, 0x86, 0xef, 0xc8, 0x3d, 0x1a, 0x73, 0x54, 0x84, 0xa3, - 0xca, 0xed, 0x18, 0x3f, 0x56, 0x71, 0xeb, 0xcc, 0xa5, 0x82, - 0x77, 0x50, 0x39, 0x1e, 0xce, 0xe9, 0x80, 0xa7, 0x52, 0x75, - 0x1c, 0x3b, 0x6a, 0x4d, 0x24, 0x03, 0xf6, 0xd1, 0xb8, 0x9f, - 0x4f, 0x68, 0x01, 0x26, 0xd3, 0xf4, 0x9d, 0xba, 0x20, 0x07, - 0x6e, 0x49, 0xbc, 0x9b, 0xf2, 0xd5, 0x05, 0x22, 0x4b, 0x6c, - 0x99, 0xbe, 0xd7, 0xf0, 0xfe, 0xd9, 0xb0, 0x97, 0x62, 0x45, - 0x2c, 0x0b, 0xdb, 0xfc, 0x95, 0xb2, 0x47, 0x60, 0x09, 0x2e, - 0xb4, 0x93, 0xfa, 0xdd, 0x28, 0x0f, 0x66, 0x41, 0x91, 0xb6, - 0xdf, 0xf8, 0x0d, 0x2a, 0x43, 0x64, 0x5f, 0x78, 0x11, 0x36, - 0xc3, 0xe4, 0x8d, 0xaa, 0x7a, 0x5d, 0x34, 0x13, 0xe6, 0xc1, - 0xa8, 0x8f, 0x15, 0x32, 0x5b, 0x7c, 0x89, 0xae, 0xc7, 0xe0, - 0x30, 0x17, 0x7e, 0x59, 0xac, 0x8b, 0xe2, 0xc5, 0xcb, 0xec, - 0x85, 0xa2, 0x57, 0x70, 0x19, 0x3e, 0xee, 0xc9, 0xa0, 0x87, - 0x72, 0x55, 0x3c, 0x1b, 0x81, 0xa6, 0xcf, 0xe8, 0x1d, 0x3a, - 0x53, 0x74, 0xa4, 0x83, 0xea, 0xcd, 0x38, 0x1f, 0x76, 0x51, - 0x00, 0x28, 0x50, 0x78, 0xa0, 0x88, 0xf0, 0xd8, 0x5d, 0x75, - 0x0d, 0x25, 0xfd, 0xd5, 0xad, 0x85, 0xba, 0x92, 0xea, 0xc2, - 0x1a, 0x32, 0x4a, 0x62, 0xe7, 0xcf, 0xb7, 0x9f, 0x47, 0x6f, - 0x17, 0x3f, 0x69, 0x41, 0x39, 0x11, 0xc9, 0xe1, 0x99, 0xb1, - 0x34, 0x1c, 0x64, 0x4c, 0x94, 0xbc, 0xc4, 0xec, 0xd3, 0xfb, - 0x83, 0xab, 0x73, 0x5b, 0x23, 0x0b, 0x8e, 0xa6, 0xde, 0xf6, - 0x2e, 0x06, 0x7e, 0x56, 0xd2, 0xfa, 0x82, 0xaa, 0x72, 0x5a, - 0x22, 0x0a, 0x8f, 0xa7, 0xdf, 0xf7, 0x2f, 0x07, 0x7f, 0x57, - 0x68, 0x40, 0x38, 0x10, 0xc8, 0xe0, 0x98, 0xb0, 0x35, 0x1d, - 0x65, 0x4d, 0x95, 0xbd, 0xc5, 0xed, 0xbb, 0x93, 0xeb, 0xc3, - 0x1b, 0x33, 0x4b, 0x63, 0xe6, 0xce, 0xb6, 0x9e, 0x46, 0x6e, - 0x16, 0x3e, 0x01, 0x29, 0x51, 0x79, 0xa1, 0x89, 0xf1, 0xd9, - 0x5c, 0x74, 0x0c, 0x24, 0xfc, 0xd4, 0xac, 0x84, 0xb9, 0x91, - 0xe9, 0xc1, 0x19, 0x31, 0x49, 0x61, 0xe4, 0xcc, 0xb4, 0x9c, - 0x44, 0x6c, 0x14, 0x3c, 0x03, 0x2b, 0x53, 0x7b, 0xa3, 0x8b, - 0xf3, 0xdb, 0x5e, 0x76, 0x0e, 0x26, 0xfe, 0xd6, 0xae, 0x86, - 0xd0, 0xf8, 0x80, 0xa8, 0x70, 0x58, 0x20, 0x08, 0x8d, 0xa5, - 0xdd, 0xf5, 0x2d, 0x05, 0x7d, 0x55, 0x6a, 0x42, 0x3a, 0x12, - 0xca, 0xe2, 0x9a, 0xb2, 0x37, 0x1f, 0x67, 0x4f, 0x97, 0xbf, - 0xc7, 0xef, 0x6b, 0x43, 0x3b, 0x13, 0xcb, 0xe3, 0x9b, 0xb3, - 0x36, 0x1e, 0x66, 0x4e, 0x96, 0xbe, 0xc6, 0xee, 0xd1, 0xf9, - 0x81, 0xa9, 0x71, 0x59, 0x21, 0x09, 0x8c, 0xa4, 0xdc, 0xf4, - 0x2c, 0x04, 0x7c, 0x54, 0x02, 0x2a, 0x52, 0x7a, 0xa2, 0x8a, - 0xf2, 0xda, 0x5f, 0x77, 0x0f, 0x27, 0xff, 0xd7, 0xaf, 0x87, - 0xb8, 0x90, 0xe8, 0xc0, 0x18, 0x30, 0x48, 0x60, 0xe5, 0xcd, - 0xb5, 0x9d, 0x45, 0x6d, 0x15, 0x3d, 0x00, 0x29, 0x52, 0x7b, - 0xa4, 0x8d, 0xf6, 0xdf, 0x55, 0x7c, 0x07, 0x2e, 0xf1, 0xd8, - 0xa3, 0x8a, 0xaa, 0x83, 0xf8, 0xd1, 0x0e, 0x27, 0x5c, 0x75, - 0xff, 0xd6, 0xad, 0x84, 0x5b, 0x72, 0x09, 0x20, 0x49, 0x60, - 0x1b, 0x32, 0xed, 0xc4, 0xbf, 0x96, 0x1c, 0x35, 0x4e, 0x67, - 0xb8, 0x91, 0xea, 0xc3, 0xe3, 0xca, 0xb1, 0x98, 0x47, 0x6e, - 0x15, 0x3c, 0xb6, 0x9f, 0xe4, 0xcd, 0x12, 0x3b, 0x40, 0x69, - 0x92, 0xbb, 0xc0, 0xe9, 0x36, 0x1f, 0x64, 0x4d, 0xc7, 0xee, - 0x95, 0xbc, 0x63, 0x4a, 0x31, 0x18, 0x38, 0x11, 0x6a, 0x43, - 0x9c, 0xb5, 0xce, 0xe7, 0x6d, 0x44, 0x3f, 0x16, 0xc9, 0xe0, - 0x9b, 0xb2, 0xdb, 0xf2, 0x89, 0xa0, 0x7f, 0x56, 0x2d, 0x04, - 0x8e, 0xa7, 0xdc, 0xf5, 0x2a, 0x03, 0x78, 0x51, 0x71, 0x58, - 0x23, 0x0a, 0xd5, 0xfc, 0x87, 0xae, 0x24, 0x0d, 0x76, 0x5f, - 0x80, 0xa9, 0xd2, 0xfb, 0x39, 0x10, 0x6b, 0x42, 0x9d, 0xb4, - 0xcf, 0xe6, 0x6c, 0x45, 0x3e, 0x17, 0xc8, 0xe1, 0x9a, 0xb3, - 0x93, 0xba, 0xc1, 0xe8, 0x37, 0x1e, 0x65, 0x4c, 0xc6, 0xef, - 0x94, 0xbd, 0x62, 0x4b, 0x30, 0x19, 0x70, 0x59, 0x22, 0x0b, - 0xd4, 0xfd, 0x86, 0xaf, 0x25, 0x0c, 0x77, 0x5e, 0x81, 0xa8, - 0xd3, 0xfa, 0xda, 0xf3, 0x88, 0xa1, 0x7e, 0x57, 0x2c, 0x05, - 0x8f, 0xa6, 0xdd, 0xf4, 0x2b, 0x02, 0x79, 0x50, 0xab, 0x82, - 0xf9, 0xd0, 0x0f, 0x26, 0x5d, 0x74, 0xfe, 0xd7, 0xac, 0x85, - 0x5a, 0x73, 0x08, 0x21, 0x01, 0x28, 0x53, 0x7a, 0xa5, 0x8c, - 0xf7, 0xde, 0x54, 0x7d, 0x06, 0x2f, 0xf0, 0xd9, 0xa2, 0x8b, - 0xe2, 0xcb, 0xb0, 0x99, 0x46, 0x6f, 0x14, 0x3d, 0xb7, 0x9e, - 0xe5, 0xcc, 0x13, 0x3a, 0x41, 0x68, 0x48, 0x61, 0x1a, 0x33, - 0xec, 0xc5, 0xbe, 0x97, 0x1d, 0x34, 0x4f, 0x66, 0xb9, 0x90, - 0xeb, 0xc2, 0x00, 0x2a, 0x54, 0x7e, 0xa8, 0x82, 0xfc, 0xd6, - 0x4d, 0x67, 0x19, 0x33, 0xe5, 0xcf, 0xb1, 0x9b, 0x9a, 0xb0, - 0xce, 0xe4, 0x32, 0x18, 0x66, 0x4c, 0xd7, 0xfd, 0x83, 0xa9, - 0x7f, 0x55, 0x2b, 0x01, 0x29, 0x03, 0x7d, 0x57, 0x81, 0xab, - 0xd5, 0xff, 0x64, 0x4e, 0x30, 0x1a, 0xcc, 0xe6, 0x98, 0xb2, - 0xb3, 0x99, 0xe7, 0xcd, 0x1b, 0x31, 0x4f, 0x65, 0xfe, 0xd4, - 0xaa, 0x80, 0x56, 0x7c, 0x02, 0x28, 0x52, 0x78, 0x06, 0x2c, - 0xfa, 0xd0, 0xae, 0x84, 0x1f, 0x35, 0x4b, 0x61, 0xb7, 0x9d, - 0xe3, 0xc9, 0xc8, 0xe2, 0x9c, 0xb6, 0x60, 0x4a, 0x34, 0x1e, - 0x85, 0xaf, 0xd1, 0xfb, 0x2d, 0x07, 0x79, 0x53, 0x7b, 0x51, - 0x2f, 0x05, 0xd3, 0xf9, 0x87, 0xad, 0x36, 0x1c, 0x62, 0x48, - 0x9e, 0xb4, 0xca, 0xe0, 0xe1, 0xcb, 0xb5, 0x9f, 0x49, 0x63, - 0x1d, 0x37, 0xac, 0x86, 0xf8, 0xd2, 0x04, 0x2e, 0x50, 0x7a, - 0xa4, 0x8e, 0xf0, 0xda, 0x0c, 0x26, 0x58, 0x72, 0xe9, 0xc3, - 0xbd, 0x97, 0x41, 0x6b, 0x15, 0x3f, 0x3e, 0x14, 0x6a, 0x40, - 0x96, 0xbc, 0xc2, 0xe8, 0x73, 0x59, 0x27, 0x0d, 0xdb, 0xf1, - 0x8f, 0xa5, 0x8d, 0xa7, 0xd9, 0xf3, 0x25, 0x0f, 0x71, 0x5b, - 0xc0, 0xea, 0x94, 0xbe, 0x68, 0x42, 0x3c, 0x16, 0x17, 0x3d, - 0x43, 0x69, 0xbf, 0x95, 0xeb, 0xc1, 0x5a, 0x70, 0x0e, 0x24, - 0xf2, 0xd8, 0xa6, 0x8c, 0xf6, 0xdc, 0xa2, 0x88, 0x5e, 0x74, - 0x0a, 0x20, 0xbb, 0x91, 0xef, 0xc5, 0x13, 0x39, 0x47, 0x6d, - 0x6c, 0x46, 0x38, 0x12, 0xc4, 0xee, 0x90, 0xba, 0x21, 0x0b, - 0x75, 0x5f, 0x89, 0xa3, 0xdd, 0xf7, 0xdf, 0xf5, 0x8b, 0xa1, - 0x77, 0x5d, 0x23, 0x09, 0x92, 0xb8, 0xc6, 0xec, 0x3a, 0x10, - 0x6e, 0x44, 0x45, 0x6f, 0x11, 0x3b, 0xed, 0xc7, 0xb9, 0x93, - 0x08, 0x22, 0x5c, 0x76, 0xa0, 0x8a, 0xf4, 0xde, 0x00, 0x2b, - 0x56, 0x7d, 0xac, 0x87, 0xfa, 0xd1, 0x45, 0x6e, 0x13, 0x38, - 0xe9, 0xc2, 0xbf, 0x94, 0x8a, 0xa1, 0xdc, 0xf7, 0x26, 0x0d, - 0x70, 0x5b, 0xcf, 0xe4, 0x99, 0xb2, 0x63, 0x48, 0x35, 0x1e, - 0x09, 0x22, 0x5f, 0x74, 0xa5, 0x8e, 0xf3, 0xd8, 0x4c, 0x67, - 0x1a, 0x31, 0xe0, 0xcb, 0xb6, 0x9d, 0x83, 0xa8, 0xd5, 0xfe, - 0x2f, 0x04, 0x79, 0x52, 0xc6, 0xed, 0x90, 0xbb, 0x6a, 0x41, - 0x3c, 0x17, 0x12, 0x39, 0x44, 0x6f, 0xbe, 0x95, 0xe8, 0xc3, - 0x57, 0x7c, 0x01, 0x2a, 0xfb, 0xd0, 0xad, 0x86, 0x98, 0xb3, - 0xce, 0xe5, 0x34, 0x1f, 0x62, 0x49, 0xdd, 0xf6, 0x8b, 0xa0, - 0x71, 0x5a, 0x27, 0x0c, 0x1b, 0x30, 0x4d, 0x66, 0xb7, 0x9c, - 0xe1, 0xca, 0x5e, 0x75, 0x08, 0x23, 0xf2, 0xd9, 0xa4, 0x8f, - 0x91, 0xba, 0xc7, 0xec, 0x3d, 0x16, 0x6b, 0x40, 0xd4, 0xff, - 0x82, 0xa9, 0x78, 0x53, 0x2e, 0x05, 0x24, 0x0f, 0x72, 0x59, - 0x88, 0xa3, 0xde, 0xf5, 0x61, 0x4a, 0x37, 0x1c, 0xcd, 0xe6, - 0x9b, 0xb0, 0xae, 0x85, 0xf8, 0xd3, 0x02, 0x29, 0x54, 0x7f, - 0xeb, 0xc0, 0xbd, 0x96, 0x47, 0x6c, 0x11, 0x3a, 0x2d, 0x06, - 0x7b, 0x50, 0x81, 0xaa, 0xd7, 0xfc, 0x68, 0x43, 0x3e, 0x15, - 0xc4, 0xef, 0x92, 0xb9, 0xa7, 0x8c, 0xf1, 0xda, 0x0b, 0x20, - 0x5d, 0x76, 0xe2, 0xc9, 0xb4, 0x9f, 0x4e, 0x65, 0x18, 0x33, - 0x36, 0x1d, 0x60, 0x4b, 0x9a, 0xb1, 0xcc, 0xe7, 0x73, 0x58, - 0x25, 0x0e, 0xdf, 0xf4, 0x89, 0xa2, 0xbc, 0x97, 0xea, 0xc1, - 0x10, 0x3b, 0x46, 0x6d, 0xf9, 0xd2, 0xaf, 0x84, 0x55, 0x7e, - 0x03, 0x28, 0x3f, 0x14, 0x69, 0x42, 0x93, 0xb8, 0xc5, 0xee, - 0x7a, 0x51, 0x2c, 0x07, 0xd6, 0xfd, 0x80, 0xab, 0xb5, 0x9e, - 0xe3, 0xc8, 0x19, 0x32, 0x4f, 0x64, 0xf0, 0xdb, 0xa6, 0x8d, - 0x5c, 0x77, 0x0a, 0x21, 0x00, 0x2c, 0x58, 0x74, 0xb0, 0x9c, - 0xe8, 0xc4, 0x7d, 0x51, 0x25, 0x09, 0xcd, 0xe1, 0x95, 0xb9, - 0xfa, 0xd6, 0xa2, 0x8e, 0x4a, 0x66, 0x12, 0x3e, 0x87, 0xab, - 0xdf, 0xf3, 0x37, 0x1b, 0x6f, 0x43, 0xe9, 0xc5, 0xb1, 0x9d, - 0x59, 0x75, 0x01, 0x2d, 0x94, 0xb8, 0xcc, 0xe0, 0x24, 0x08, - 0x7c, 0x50, 0x13, 0x3f, 0x4b, 0x67, 0xa3, 0x8f, 0xfb, 0xd7, - 0x6e, 0x42, 0x36, 0x1a, 0xde, 0xf2, 0x86, 0xaa, 0xcf, 0xe3, - 0x97, 0xbb, 0x7f, 0x53, 0x27, 0x0b, 0xb2, 0x9e, 0xea, 0xc6, - 0x02, 0x2e, 0x5a, 0x76, 0x35, 0x19, 0x6d, 0x41, 0x85, 0xa9, - 0xdd, 0xf1, 0x48, 0x64, 0x10, 0x3c, 0xf8, 0xd4, 0xa0, 0x8c, - 0x26, 0x0a, 0x7e, 0x52, 0x96, 0xba, 0xce, 0xe2, 0x5b, 0x77, - 0x03, 0x2f, 0xeb, 0xc7, 0xb3, 0x9f, 0xdc, 0xf0, 0x84, 0xa8, - 0x6c, 0x40, 0x34, 0x18, 0xa1, 0x8d, 0xf9, 0xd5, 0x11, 0x3d, - 0x49, 0x65, 0x83, 0xaf, 0xdb, 0xf7, 0x33, 0x1f, 0x6b, 0x47, - 0xfe, 0xd2, 0xa6, 0x8a, 0x4e, 0x62, 0x16, 0x3a, 0x79, 0x55, - 0x21, 0x0d, 0xc9, 0xe5, 0x91, 0xbd, 0x04, 0x28, 0x5c, 0x70, - 0xb4, 0x98, 0xec, 0xc0, 0x6a, 0x46, 0x32, 0x1e, 0xda, 0xf6, - 0x82, 0xae, 0x17, 0x3b, 0x4f, 0x63, 0xa7, 0x8b, 0xff, 0xd3, - 0x90, 0xbc, 0xc8, 0xe4, 0x20, 0x0c, 0x78, 0x54, 0xed, 0xc1, - 0xb5, 0x99, 0x5d, 0x71, 0x05, 0x29, 0x4c, 0x60, 0x14, 0x38, - 0xfc, 0xd0, 0xa4, 0x88, 0x31, 0x1d, 0x69, 0x45, 0x81, 0xad, - 0xd9, 0xf5, 0xb6, 0x9a, 0xee, 0xc2, 0x06, 0x2a, 0x5e, 0x72, - 0xcb, 0xe7, 0x93, 0xbf, 0x7b, 0x57, 0x23, 0x0f, 0xa5, 0x89, - 0xfd, 0xd1, 0x15, 0x39, 0x4d, 0x61, 0xd8, 0xf4, 0x80, 0xac, - 0x68, 0x44, 0x30, 0x1c, 0x5f, 0x73, 0x07, 0x2b, 0xef, 0xc3, - 0xb7, 0x9b, 0x22, 0x0e, 0x7a, 0x56, 0x92, 0xbe, 0xca, 0xe6, - 0x00, 0x2d, 0x5a, 0x77, 0xb4, 0x99, 0xee, 0xc3, 0x75, 0x58, - 0x2f, 0x02, 0xc1, 0xec, 0x9b, 0xb6, 0xea, 0xc7, 0xb0, 0x9d, - 0x5e, 0x73, 0x04, 0x29, 0x9f, 0xb2, 0xc5, 0xe8, 0x2b, 0x06, - 0x71, 0x5c, 0xc9, 0xe4, 0x93, 0xbe, 0x7d, 0x50, 0x27, 0x0a, - 0xbc, 0x91, 0xe6, 0xcb, 0x08, 0x25, 0x52, 0x7f, 0x23, 0x0e, - 0x79, 0x54, 0x97, 0xba, 0xcd, 0xe0, 0x56, 0x7b, 0x0c, 0x21, - 0xe2, 0xcf, 0xb8, 0x95, 0x8f, 0xa2, 0xd5, 0xf8, 0x3b, 0x16, - 0x61, 0x4c, 0xfa, 0xd7, 0xa0, 0x8d, 0x4e, 0x63, 0x14, 0x39, - 0x65, 0x48, 0x3f, 0x12, 0xd1, 0xfc, 0x8b, 0xa6, 0x10, 0x3d, - 0x4a, 0x67, 0xa4, 0x89, 0xfe, 0xd3, 0x46, 0x6b, 0x1c, 0x31, - 0xf2, 0xdf, 0xa8, 0x85, 0x33, 0x1e, 0x69, 0x44, 0x87, 0xaa, - 0xdd, 0xf0, 0xac, 0x81, 0xf6, 0xdb, 0x18, 0x35, 0x42, 0x6f, - 0xd9, 0xf4, 0x83, 0xae, 0x6d, 0x40, 0x37, 0x1a, 0x03, 0x2e, - 0x59, 0x74, 0xb7, 0x9a, 0xed, 0xc0, 0x76, 0x5b, 0x2c, 0x01, - 0xc2, 0xef, 0x98, 0xb5, 0xe9, 0xc4, 0xb3, 0x9e, 0x5d, 0x70, - 0x07, 0x2a, 0x9c, 0xb1, 0xc6, 0xeb, 0x28, 0x05, 0x72, 0x5f, - 0xca, 0xe7, 0x90, 0xbd, 0x7e, 0x53, 0x24, 0x09, 0xbf, 0x92, - 0xe5, 0xc8, 0x0b, 0x26, 0x51, 0x7c, 0x20, 0x0d, 0x7a, 0x57, - 0x94, 0xb9, 0xce, 0xe3, 0x55, 0x78, 0x0f, 0x22, 0xe1, 0xcc, - 0xbb, 0x96, 0x8c, 0xa1, 0xd6, 0xfb, 0x38, 0x15, 0x62, 0x4f, - 0xf9, 0xd4, 0xa3, 0x8e, 0x4d, 0x60, 0x17, 0x3a, 0x66, 0x4b, - 0x3c, 0x11, 0xd2, 0xff, 0x88, 0xa5, 0x13, 0x3e, 0x49, 0x64, - 0xa7, 0x8a, 0xfd, 0xd0, 0x45, 0x68, 0x1f, 0x32, 0xf1, 0xdc, - 0xab, 0x86, 0x30, 0x1d, 0x6a, 0x47, 0x84, 0xa9, 0xde, 0xf3, - 0xaf, 0x82, 0xf5, 0xd8, 0x1b, 0x36, 0x41, 0x6c, 0xda, 0xf7, - 0x80, 0xad, 0x6e, 0x43, 0x34, 0x19, 0x00, 0x2e, 0x5c, 0x72, - 0xb8, 0x96, 0xe4, 0xca, 0x6d, 0x43, 0x31, 0x1f, 0xd5, 0xfb, - 0x89, 0xa7, 0xda, 0xf4, 0x86, 0xa8, 0x62, 0x4c, 0x3e, 0x10, - 0xb7, 0x99, 0xeb, 0xc5, 0x0f, 0x21, 0x53, 0x7d, 0xa9, 0x87, - 0xf5, 0xdb, 0x11, 0x3f, 0x4d, 0x63, 0xc4, 0xea, 0x98, 0xb6, - 0x7c, 0x52, 0x20, 0x0e, 0x73, 0x5d, 0x2f, 0x01, 0xcb, 0xe5, - 0x97, 0xb9, 0x1e, 0x30, 0x42, 0x6c, 0xa6, 0x88, 0xfa, 0xd4, - 0x4f, 0x61, 0x13, 0x3d, 0xf7, 0xd9, 0xab, 0x85, 0x22, 0x0c, - 0x7e, 0x50, 0x9a, 0xb4, 0xc6, 0xe8, 0x95, 0xbb, 0xc9, 0xe7, - 0x2d, 0x03, 0x71, 0x5f, 0xf8, 0xd6, 0xa4, 0x8a, 0x40, 0x6e, - 0x1c, 0x32, 0xe6, 0xc8, 0xba, 0x94, 0x5e, 0x70, 0x02, 0x2c, - 0x8b, 0xa5, 0xd7, 0xf9, 0x33, 0x1d, 0x6f, 0x41, 0x3c, 0x12, - 0x60, 0x4e, 0x84, 0xaa, 0xd8, 0xf6, 0x51, 0x7f, 0x0d, 0x23, - 0xe9, 0xc7, 0xb5, 0x9b, 0x9e, 0xb0, 0xc2, 0xec, 0x26, 0x08, - 0x7a, 0x54, 0xf3, 0xdd, 0xaf, 0x81, 0x4b, 0x65, 0x17, 0x39, - 0x44, 0x6a, 0x18, 0x36, 0xfc, 0xd2, 0xa0, 0x8e, 0x29, 0x07, - 0x75, 0x5b, 0x91, 0xbf, 0xcd, 0xe3, 0x37, 0x19, 0x6b, 0x45, - 0x8f, 0xa1, 0xd3, 0xfd, 0x5a, 0x74, 0x06, 0x28, 0xe2, 0xcc, - 0xbe, 0x90, 0xed, 0xc3, 0xb1, 0x9f, 0x55, 0x7b, 0x09, 0x27, - 0x80, 0xae, 0xdc, 0xf2, 0x38, 0x16, 0x64, 0x4a, 0xd1, 0xff, - 0x8d, 0xa3, 0x69, 0x47, 0x35, 0x1b, 0xbc, 0x92, 0xe0, 0xce, - 0x04, 0x2a, 0x58, 0x76, 0x0b, 0x25, 0x57, 0x79, 0xb3, 0x9d, - 0xef, 0xc1, 0x66, 0x48, 0x3a, 0x14, 0xde, 0xf0, 0x82, 0xac, - 0x78, 0x56, 0x24, 0x0a, 0xc0, 0xee, 0x9c, 0xb2, 0x15, 0x3b, - 0x49, 0x67, 0xad, 0x83, 0xf1, 0xdf, 0xa2, 0x8c, 0xfe, 0xd0, - 0x1a, 0x34, 0x46, 0x68, 0xcf, 0xe1, 0x93, 0xbd, 0x77, 0x59, - 0x2b, 0x05, 0x00, 0x2f, 0x5e, 0x71, 0xbc, 0x93, 0xe2, 0xcd, - 0x65, 0x4a, 0x3b, 0x14, 0xd9, 0xf6, 0x87, 0xa8, 0xca, 0xe5, - 0x94, 0xbb, 0x76, 0x59, 0x28, 0x07, 0xaf, 0x80, 0xf1, 0xde, - 0x13, 0x3c, 0x4d, 0x62, 0x89, 0xa6, 0xd7, 0xf8, 0x35, 0x1a, - 0x6b, 0x44, 0xec, 0xc3, 0xb2, 0x9d, 0x50, 0x7f, 0x0e, 0x21, - 0x43, 0x6c, 0x1d, 0x32, 0xff, 0xd0, 0xa1, 0x8e, 0x26, 0x09, - 0x78, 0x57, 0x9a, 0xb5, 0xc4, 0xeb, 0x0f, 0x20, 0x51, 0x7e, - 0xb3, 0x9c, 0xed, 0xc2, 0x6a, 0x45, 0x34, 0x1b, 0xd6, 0xf9, - 0x88, 0xa7, 0xc5, 0xea, 0x9b, 0xb4, 0x79, 0x56, 0x27, 0x08, - 0xa0, 0x8f, 0xfe, 0xd1, 0x1c, 0x33, 0x42, 0x6d, 0x86, 0xa9, - 0xd8, 0xf7, 0x3a, 0x15, 0x64, 0x4b, 0xe3, 0xcc, 0xbd, 0x92, - 0x5f, 0x70, 0x01, 0x2e, 0x4c, 0x63, 0x12, 0x3d, 0xf0, 0xdf, - 0xae, 0x81, 0x29, 0x06, 0x77, 0x58, 0x95, 0xba, 0xcb, 0xe4, - 0x1e, 0x31, 0x40, 0x6f, 0xa2, 0x8d, 0xfc, 0xd3, 0x7b, 0x54, - 0x25, 0x0a, 0xc7, 0xe8, 0x99, 0xb6, 0xd4, 0xfb, 0x8a, 0xa5, - 0x68, 0x47, 0x36, 0x19, 0xb1, 0x9e, 0xef, 0xc0, 0x0d, 0x22, - 0x53, 0x7c, 0x97, 0xb8, 0xc9, 0xe6, 0x2b, 0x04, 0x75, 0x5a, - 0xf2, 0xdd, 0xac, 0x83, 0x4e, 0x61, 0x10, 0x3f, 0x5d, 0x72, - 0x03, 0x2c, 0xe1, 0xce, 0xbf, 0x90, 0x38, 0x17, 0x66, 0x49, - 0x84, 0xab, 0xda, 0xf5, 0x11, 0x3e, 0x4f, 0x60, 0xad, 0x82, - 0xf3, 0xdc, 0x74, 0x5b, 0x2a, 0x05, 0xc8, 0xe7, 0x96, 0xb9, - 0xdb, 0xf4, 0x85, 0xaa, 0x67, 0x48, 0x39, 0x16, 0xbe, 0x91, - 0xe0, 0xcf, 0x02, 0x2d, 0x5c, 0x73, 0x98, 0xb7, 0xc6, 0xe9, - 0x24, 0x0b, 0x7a, 0x55, 0xfd, 0xd2, 0xa3, 0x8c, 0x41, 0x6e, - 0x1f, 0x30, 0x52, 0x7d, 0x0c, 0x23, 0xee, 0xc1, 0xb0, 0x9f, - 0x37, 0x18, 0x69, 0x46, 0x8b, 0xa4, 0xd5, 0xfa, 0x00, 0x30, - 0x60, 0x50, 0xc0, 0xf0, 0xa0, 0x90, 0x9d, 0xad, 0xfd, 0xcd, - 0x5d, 0x6d, 0x3d, 0x0d, 0x27, 0x17, 0x47, 0x77, 0xe7, 0xd7, - 0x87, 0xb7, 0xba, 0x8a, 0xda, 0xea, 0x7a, 0x4a, 0x1a, 0x2a, - 0x4e, 0x7e, 0x2e, 0x1e, 0x8e, 0xbe, 0xee, 0xde, 0xd3, 0xe3, - 0xb3, 0x83, 0x13, 0x23, 0x73, 0x43, 0x69, 0x59, 0x09, 0x39, - 0xa9, 0x99, 0xc9, 0xf9, 0xf4, 0xc4, 0x94, 0xa4, 0x34, 0x04, - 0x54, 0x64, 0x9c, 0xac, 0xfc, 0xcc, 0x5c, 0x6c, 0x3c, 0x0c, - 0x01, 0x31, 0x61, 0x51, 0xc1, 0xf1, 0xa1, 0x91, 0xbb, 0x8b, - 0xdb, 0xeb, 0x7b, 0x4b, 0x1b, 0x2b, 0x26, 0x16, 0x46, 0x76, - 0xe6, 0xd6, 0x86, 0xb6, 0xd2, 0xe2, 0xb2, 0x82, 0x12, 0x22, - 0x72, 0x42, 0x4f, 0x7f, 0x2f, 0x1f, 0x8f, 0xbf, 0xef, 0xdf, - 0xf5, 0xc5, 0x95, 0xa5, 0x35, 0x05, 0x55, 0x65, 0x68, 0x58, - 0x08, 0x38, 0xa8, 0x98, 0xc8, 0xf8, 0x25, 0x15, 0x45, 0x75, - 0xe5, 0xd5, 0x85, 0xb5, 0xb8, 0x88, 0xd8, 0xe8, 0x78, 0x48, - 0x18, 0x28, 0x02, 0x32, 0x62, 0x52, 0xc2, 0xf2, 0xa2, 0x92, - 0x9f, 0xaf, 0xff, 0xcf, 0x5f, 0x6f, 0x3f, 0x0f, 0x6b, 0x5b, - 0x0b, 0x3b, 0xab, 0x9b, 0xcb, 0xfb, 0xf6, 0xc6, 0x96, 0xa6, - 0x36, 0x06, 0x56, 0x66, 0x4c, 0x7c, 0x2c, 0x1c, 0x8c, 0xbc, - 0xec, 0xdc, 0xd1, 0xe1, 0xb1, 0x81, 0x11, 0x21, 0x71, 0x41, - 0xb9, 0x89, 0xd9, 0xe9, 0x79, 0x49, 0x19, 0x29, 0x24, 0x14, - 0x44, 0x74, 0xe4, 0xd4, 0x84, 0xb4, 0x9e, 0xae, 0xfe, 0xce, - 0x5e, 0x6e, 0x3e, 0x0e, 0x03, 0x33, 0x63, 0x53, 0xc3, 0xf3, - 0xa3, 0x93, 0xf7, 0xc7, 0x97, 0xa7, 0x37, 0x07, 0x57, 0x67, - 0x6a, 0x5a, 0x0a, 0x3a, 0xaa, 0x9a, 0xca, 0xfa, 0xd0, 0xe0, - 0xb0, 0x80, 0x10, 0x20, 0x70, 0x40, 0x4d, 0x7d, 0x2d, 0x1d, - 0x8d, 0xbd, 0xed, 0xdd, 0x00, 0x31, 0x62, 0x53, 0xc4, 0xf5, - 0xa6, 0x97, 0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x02, - 0x37, 0x06, 0x55, 0x64, 0xf3, 0xc2, 0x91, 0xa0, 0xa2, 0x93, - 0xc0, 0xf1, 0x66, 0x57, 0x04, 0x35, 0x6e, 0x5f, 0x0c, 0x3d, - 0xaa, 0x9b, 0xc8, 0xf9, 0xfb, 0xca, 0x99, 0xa8, 0x3f, 0x0e, - 0x5d, 0x6c, 0x59, 0x68, 0x3b, 0x0a, 0x9d, 0xac, 0xff, 0xce, - 0xcc, 0xfd, 0xae, 0x9f, 0x08, 0x39, 0x6a, 0x5b, 0xdc, 0xed, - 0xbe, 0x8f, 0x18, 0x29, 0x7a, 0x4b, 0x49, 0x78, 0x2b, 0x1a, - 0x8d, 0xbc, 0xef, 0xde, 0xeb, 0xda, 0x89, 0xb8, 0x2f, 0x1e, - 0x4d, 0x7c, 0x7e, 0x4f, 0x1c, 0x2d, 0xba, 0x8b, 0xd8, 0xe9, - 0xb2, 0x83, 0xd0, 0xe1, 0x76, 0x47, 0x14, 0x25, 0x27, 0x16, - 0x45, 0x74, 0xe3, 0xd2, 0x81, 0xb0, 0x85, 0xb4, 0xe7, 0xd6, - 0x41, 0x70, 0x23, 0x12, 0x10, 0x21, 0x72, 0x43, 0xd4, 0xe5, - 0xb6, 0x87, 0xa5, 0x94, 0xc7, 0xf6, 0x61, 0x50, 0x03, 0x32, - 0x30, 0x01, 0x52, 0x63, 0xf4, 0xc5, 0x96, 0xa7, 0x92, 0xa3, - 0xf0, 0xc1, 0x56, 0x67, 0x34, 0x05, 0x07, 0x36, 0x65, 0x54, - 0xc3, 0xf2, 0xa1, 0x90, 0xcb, 0xfa, 0xa9, 0x98, 0x0f, 0x3e, - 0x6d, 0x5c, 0x5e, 0x6f, 0x3c, 0x0d, 0x9a, 0xab, 0xf8, 0xc9, - 0xfc, 0xcd, 0x9e, 0xaf, 0x38, 0x09, 0x5a, 0x6b, 0x69, 0x58, - 0x0b, 0x3a, 0xad, 0x9c, 0xcf, 0xfe, 0x79, 0x48, 0x1b, 0x2a, - 0xbd, 0x8c, 0xdf, 0xee, 0xec, 0xdd, 0x8e, 0xbf, 0x28, 0x19, - 0x4a, 0x7b, 0x4e, 0x7f, 0x2c, 0x1d, 0x8a, 0xbb, 0xe8, 0xd9, - 0xdb, 0xea, 0xb9, 0x88, 0x1f, 0x2e, 0x7d, 0x4c, 0x17, 0x26, - 0x75, 0x44, 0xd3, 0xe2, 0xb1, 0x80, 0x82, 0xb3, 0xe0, 0xd1, - 0x46, 0x77, 0x24, 0x15, 0x20, 0x11, 0x42, 0x73, 0xe4, 0xd5, - 0x86, 0xb7, 0xb5, 0x84, 0xd7, 0xe6, 0x71, 0x40, 0x13, 0x22, - 0x00, 0x32, 0x64, 0x56, 0xc8, 0xfa, 0xac, 0x9e, 0x8d, 0xbf, - 0xe9, 0xdb, 0x45, 0x77, 0x21, 0x13, 0x07, 0x35, 0x63, 0x51, - 0xcf, 0xfd, 0xab, 0x99, 0x8a, 0xb8, 0xee, 0xdc, 0x42, 0x70, - 0x26, 0x14, 0x0e, 0x3c, 0x6a, 0x58, 0xc6, 0xf4, 0xa2, 0x90, - 0x83, 0xb1, 0xe7, 0xd5, 0x4b, 0x79, 0x2f, 0x1d, 0x09, 0x3b, - 0x6d, 0x5f, 0xc1, 0xf3, 0xa5, 0x97, 0x84, 0xb6, 0xe0, 0xd2, - 0x4c, 0x7e, 0x28, 0x1a, 0x1c, 0x2e, 0x78, 0x4a, 0xd4, 0xe6, - 0xb0, 0x82, 0x91, 0xa3, 0xf5, 0xc7, 0x59, 0x6b, 0x3d, 0x0f, - 0x1b, 0x29, 0x7f, 0x4d, 0xd3, 0xe1, 0xb7, 0x85, 0x96, 0xa4, - 0xf2, 0xc0, 0x5e, 0x6c, 0x3a, 0x08, 0x12, 0x20, 0x76, 0x44, - 0xda, 0xe8, 0xbe, 0x8c, 0x9f, 0xad, 0xfb, 0xc9, 0x57, 0x65, - 0x33, 0x01, 0x15, 0x27, 0x71, 0x43, 0xdd, 0xef, 0xb9, 0x8b, - 0x98, 0xaa, 0xfc, 0xce, 0x50, 0x62, 0x34, 0x06, 0x38, 0x0a, - 0x5c, 0x6e, 0xf0, 0xc2, 0x94, 0xa6, 0xb5, 0x87, 0xd1, 0xe3, - 0x7d, 0x4f, 0x19, 0x2b, 0x3f, 0x0d, 0x5b, 0x69, 0xf7, 0xc5, - 0x93, 0xa1, 0xb2, 0x80, 0xd6, 0xe4, 0x7a, 0x48, 0x1e, 0x2c, - 0x36, 0x04, 0x52, 0x60, 0xfe, 0xcc, 0x9a, 0xa8, 0xbb, 0x89, - 0xdf, 0xed, 0x73, 0x41, 0x17, 0x25, 0x31, 0x03, 0x55, 0x67, - 0xf9, 0xcb, 0x9d, 0xaf, 0xbc, 0x8e, 0xd8, 0xea, 0x74, 0x46, - 0x10, 0x22, 0x24, 0x16, 0x40, 0x72, 0xec, 0xde, 0x88, 0xba, - 0xa9, 0x9b, 0xcd, 0xff, 0x61, 0x53, 0x05, 0x37, 0x23, 0x11, - 0x47, 0x75, 0xeb, 0xd9, 0x8f, 0xbd, 0xae, 0x9c, 0xca, 0xf8, - 0x66, 0x54, 0x02, 0x30, 0x2a, 0x18, 0x4e, 0x7c, 0xe2, 0xd0, - 0x86, 0xb4, 0xa7, 0x95, 0xc3, 0xf1, 0x6f, 0x5d, 0x0b, 0x39, - 0x2d, 0x1f, 0x49, 0x7b, 0xe5, 0xd7, 0x81, 0xb3, 0xa0, 0x92, - 0xc4, 0xf6, 0x68, 0x5a, 0x0c, 0x3e, 0x00, 0x33, 0x66, 0x55, - 0xcc, 0xff, 0xaa, 0x99, 0x85, 0xb6, 0xe3, 0xd0, 0x49, 0x7a, - 0x2f, 0x1c, 0x17, 0x24, 0x71, 0x42, 0xdb, 0xe8, 0xbd, 0x8e, - 0x92, 0xa1, 0xf4, 0xc7, 0x5e, 0x6d, 0x38, 0x0b, 0x2e, 0x1d, - 0x48, 0x7b, 0xe2, 0xd1, 0x84, 0xb7, 0xab, 0x98, 0xcd, 0xfe, - 0x67, 0x54, 0x01, 0x32, 0x39, 0x0a, 0x5f, 0x6c, 0xf5, 0xc6, - 0x93, 0xa0, 0xbc, 0x8f, 0xda, 0xe9, 0x70, 0x43, 0x16, 0x25, - 0x5c, 0x6f, 0x3a, 0x09, 0x90, 0xa3, 0xf6, 0xc5, 0xd9, 0xea, - 0xbf, 0x8c, 0x15, 0x26, 0x73, 0x40, 0x4b, 0x78, 0x2d, 0x1e, - 0x87, 0xb4, 0xe1, 0xd2, 0xce, 0xfd, 0xa8, 0x9b, 0x02, 0x31, - 0x64, 0x57, 0x72, 0x41, 0x14, 0x27, 0xbe, 0x8d, 0xd8, 0xeb, - 0xf7, 0xc4, 0x91, 0xa2, 0x3b, 0x08, 0x5d, 0x6e, 0x65, 0x56, - 0x03, 0x30, 0xa9, 0x9a, 0xcf, 0xfc, 0xe0, 0xd3, 0x86, 0xb5, - 0x2c, 0x1f, 0x4a, 0x79, 0xb8, 0x8b, 0xde, 0xed, 0x74, 0x47, - 0x12, 0x21, 0x3d, 0x0e, 0x5b, 0x68, 0xf1, 0xc2, 0x97, 0xa4, - 0xaf, 0x9c, 0xc9, 0xfa, 0x63, 0x50, 0x05, 0x36, 0x2a, 0x19, - 0x4c, 0x7f, 0xe6, 0xd5, 0x80, 0xb3, 0x96, 0xa5, 0xf0, 0xc3, - 0x5a, 0x69, 0x3c, 0x0f, 0x13, 0x20, 0x75, 0x46, 0xdf, 0xec, - 0xb9, 0x8a, 0x81, 0xb2, 0xe7, 0xd4, 0x4d, 0x7e, 0x2b, 0x18, - 0x04, 0x37, 0x62, 0x51, 0xc8, 0xfb, 0xae, 0x9d, 0xe4, 0xd7, - 0x82, 0xb1, 0x28, 0x1b, 0x4e, 0x7d, 0x61, 0x52, 0x07, 0x34, - 0xad, 0x9e, 0xcb, 0xf8, 0xf3, 0xc0, 0x95, 0xa6, 0x3f, 0x0c, - 0x59, 0x6a, 0x76, 0x45, 0x10, 0x23, 0xba, 0x89, 0xdc, 0xef, - 0xca, 0xf9, 0xac, 0x9f, 0x06, 0x35, 0x60, 0x53, 0x4f, 0x7c, - 0x29, 0x1a, 0x83, 0xb0, 0xe5, 0xd6, 0xdd, 0xee, 0xbb, 0x88, - 0x11, 0x22, 0x77, 0x44, 0x58, 0x6b, 0x3e, 0x0d, 0x94, 0xa7, - 0xf2, 0xc1, 0x00, 0x34, 0x68, 0x5c, 0xd0, 0xe4, 0xb8, 0x8c, - 0xbd, 0x89, 0xd5, 0xe1, 0x6d, 0x59, 0x05, 0x31, 0x67, 0x53, - 0x0f, 0x3b, 0xb7, 0x83, 0xdf, 0xeb, 0xda, 0xee, 0xb2, 0x86, - 0x0a, 0x3e, 0x62, 0x56, 0xce, 0xfa, 0xa6, 0x92, 0x1e, 0x2a, - 0x76, 0x42, 0x73, 0x47, 0x1b, 0x2f, 0xa3, 0x97, 0xcb, 0xff, - 0xa9, 0x9d, 0xc1, 0xf5, 0x79, 0x4d, 0x11, 0x25, 0x14, 0x20, - 0x7c, 0x48, 0xc4, 0xf0, 0xac, 0x98, 0x81, 0xb5, 0xe9, 0xdd, - 0x51, 0x65, 0x39, 0x0d, 0x3c, 0x08, 0x54, 0x60, 0xec, 0xd8, - 0x84, 0xb0, 0xe6, 0xd2, 0x8e, 0xba, 0x36, 0x02, 0x5e, 0x6a, - 0x5b, 0x6f, 0x33, 0x07, 0x8b, 0xbf, 0xe3, 0xd7, 0x4f, 0x7b, - 0x27, 0x13, 0x9f, 0xab, 0xf7, 0xc3, 0xf2, 0xc6, 0x9a, 0xae, - 0x22, 0x16, 0x4a, 0x7e, 0x28, 0x1c, 0x40, 0x74, 0xf8, 0xcc, - 0x90, 0xa4, 0x95, 0xa1, 0xfd, 0xc9, 0x45, 0x71, 0x2d, 0x19, - 0x1f, 0x2b, 0x77, 0x43, 0xcf, 0xfb, 0xa7, 0x93, 0xa2, 0x96, - 0xca, 0xfe, 0x72, 0x46, 0x1a, 0x2e, 0x78, 0x4c, 0x10, 0x24, - 0xa8, 0x9c, 0xc0, 0xf4, 0xc5, 0xf1, 0xad, 0x99, 0x15, 0x21, - 0x7d, 0x49, 0xd1, 0xe5, 0xb9, 0x8d, 0x01, 0x35, 0x69, 0x5d, - 0x6c, 0x58, 0x04, 0x30, 0xbc, 0x88, 0xd4, 0xe0, 0xb6, 0x82, - 0xde, 0xea, 0x66, 0x52, 0x0e, 0x3a, 0x0b, 0x3f, 0x63, 0x57, - 0xdb, 0xef, 0xb3, 0x87, 0x9e, 0xaa, 0xf6, 0xc2, 0x4e, 0x7a, - 0x26, 0x12, 0x23, 0x17, 0x4b, 0x7f, 0xf3, 0xc7, 0x9b, 0xaf, - 0xf9, 0xcd, 0x91, 0xa5, 0x29, 0x1d, 0x41, 0x75, 0x44, 0x70, - 0x2c, 0x18, 0x94, 0xa0, 0xfc, 0xc8, 0x50, 0x64, 0x38, 0x0c, - 0x80, 0xb4, 0xe8, 0xdc, 0xed, 0xd9, 0x85, 0xb1, 0x3d, 0x09, - 0x55, 0x61, 0x37, 0x03, 0x5f, 0x6b, 0xe7, 0xd3, 0x8f, 0xbb, - 0x8a, 0xbe, 0xe2, 0xd6, 0x5a, 0x6e, 0x32, 0x06, 0x00, 0x35, - 0x6a, 0x5f, 0xd4, 0xe1, 0xbe, 0x8b, 0xb5, 0x80, 0xdf, 0xea, - 0x61, 0x54, 0x0b, 0x3e, 0x77, 0x42, 0x1d, 0x28, 0xa3, 0x96, - 0xc9, 0xfc, 0xc2, 0xf7, 0xa8, 0x9d, 0x16, 0x23, 0x7c, 0x49, - 0xee, 0xdb, 0x84, 0xb1, 0x3a, 0x0f, 0x50, 0x65, 0x5b, 0x6e, - 0x31, 0x04, 0x8f, 0xba, 0xe5, 0xd0, 0x99, 0xac, 0xf3, 0xc6, - 0x4d, 0x78, 0x27, 0x12, 0x2c, 0x19, 0x46, 0x73, 0xf8, 0xcd, - 0x92, 0xa7, 0xc1, 0xf4, 0xab, 0x9e, 0x15, 0x20, 0x7f, 0x4a, - 0x74, 0x41, 0x1e, 0x2b, 0xa0, 0x95, 0xca, 0xff, 0xb6, 0x83, - 0xdc, 0xe9, 0x62, 0x57, 0x08, 0x3d, 0x03, 0x36, 0x69, 0x5c, - 0xd7, 0xe2, 0xbd, 0x88, 0x2f, 0x1a, 0x45, 0x70, 0xfb, 0xce, - 0x91, 0xa4, 0x9a, 0xaf, 0xf0, 0xc5, 0x4e, 0x7b, 0x24, 0x11, - 0x58, 0x6d, 0x32, 0x07, 0x8c, 0xb9, 0xe6, 0xd3, 0xed, 0xd8, - 0x87, 0xb2, 0x39, 0x0c, 0x53, 0x66, 0x9f, 0xaa, 0xf5, 0xc0, - 0x4b, 0x7e, 0x21, 0x14, 0x2a, 0x1f, 0x40, 0x75, 0xfe, 0xcb, - 0x94, 0xa1, 0xe8, 0xdd, 0x82, 0xb7, 0x3c, 0x09, 0x56, 0x63, - 0x5d, 0x68, 0x37, 0x02, 0x89, 0xbc, 0xe3, 0xd6, 0x71, 0x44, - 0x1b, 0x2e, 0xa5, 0x90, 0xcf, 0xfa, 0xc4, 0xf1, 0xae, 0x9b, - 0x10, 0x25, 0x7a, 0x4f, 0x06, 0x33, 0x6c, 0x59, 0xd2, 0xe7, - 0xb8, 0x8d, 0xb3, 0x86, 0xd9, 0xec, 0x67, 0x52, 0x0d, 0x38, - 0x5e, 0x6b, 0x34, 0x01, 0x8a, 0xbf, 0xe0, 0xd5, 0xeb, 0xde, - 0x81, 0xb4, 0x3f, 0x0a, 0x55, 0x60, 0x29, 0x1c, 0x43, 0x76, - 0xfd, 0xc8, 0x97, 0xa2, 0x9c, 0xa9, 0xf6, 0xc3, 0x48, 0x7d, - 0x22, 0x17, 0xb0, 0x85, 0xda, 0xef, 0x64, 0x51, 0x0e, 0x3b, - 0x05, 0x30, 0x6f, 0x5a, 0xd1, 0xe4, 0xbb, 0x8e, 0xc7, 0xf2, - 0xad, 0x98, 0x13, 0x26, 0x79, 0x4c, 0x72, 0x47, 0x18, 0x2d, - 0xa6, 0x93, 0xcc, 0xf9, 0x00, 0x36, 0x6c, 0x5a, 0xd8, 0xee, - 0xb4, 0x82, 0xad, 0x9b, 0xc1, 0xf7, 0x75, 0x43, 0x19, 0x2f, - 0x47, 0x71, 0x2b, 0x1d, 0x9f, 0xa9, 0xf3, 0xc5, 0xea, 0xdc, - 0x86, 0xb0, 0x32, 0x04, 0x5e, 0x68, 0x8e, 0xb8, 0xe2, 0xd4, - 0x56, 0x60, 0x3a, 0x0c, 0x23, 0x15, 0x4f, 0x79, 0xfb, 0xcd, - 0x97, 0xa1, 0xc9, 0xff, 0xa5, 0x93, 0x11, 0x27, 0x7d, 0x4b, - 0x64, 0x52, 0x08, 0x3e, 0xbc, 0x8a, 0xd0, 0xe6, 0x01, 0x37, - 0x6d, 0x5b, 0xd9, 0xef, 0xb5, 0x83, 0xac, 0x9a, 0xc0, 0xf6, - 0x74, 0x42, 0x18, 0x2e, 0x46, 0x70, 0x2a, 0x1c, 0x9e, 0xa8, - 0xf2, 0xc4, 0xeb, 0xdd, 0x87, 0xb1, 0x33, 0x05, 0x5f, 0x69, - 0x8f, 0xb9, 0xe3, 0xd5, 0x57, 0x61, 0x3b, 0x0d, 0x22, 0x14, - 0x4e, 0x78, 0xfa, 0xcc, 0x96, 0xa0, 0xc8, 0xfe, 0xa4, 0x92, - 0x10, 0x26, 0x7c, 0x4a, 0x65, 0x53, 0x09, 0x3f, 0xbd, 0x8b, - 0xd1, 0xe7, 0x02, 0x34, 0x6e, 0x58, 0xda, 0xec, 0xb6, 0x80, - 0xaf, 0x99, 0xc3, 0xf5, 0x77, 0x41, 0x1b, 0x2d, 0x45, 0x73, - 0x29, 0x1f, 0x9d, 0xab, 0xf1, 0xc7, 0xe8, 0xde, 0x84, 0xb2, - 0x30, 0x06, 0x5c, 0x6a, 0x8c, 0xba, 0xe0, 0xd6, 0x54, 0x62, - 0x38, 0x0e, 0x21, 0x17, 0x4d, 0x7b, 0xf9, 0xcf, 0x95, 0xa3, - 0xcb, 0xfd, 0xa7, 0x91, 0x13, 0x25, 0x7f, 0x49, 0x66, 0x50, - 0x0a, 0x3c, 0xbe, 0x88, 0xd2, 0xe4, 0x03, 0x35, 0x6f, 0x59, - 0xdb, 0xed, 0xb7, 0x81, 0xae, 0x98, 0xc2, 0xf4, 0x76, 0x40, - 0x1a, 0x2c, 0x44, 0x72, 0x28, 0x1e, 0x9c, 0xaa, 0xf0, 0xc6, - 0xe9, 0xdf, 0x85, 0xb3, 0x31, 0x07, 0x5d, 0x6b, 0x8d, 0xbb, - 0xe1, 0xd7, 0x55, 0x63, 0x39, 0x0f, 0x20, 0x16, 0x4c, 0x7a, - 0xf8, 0xce, 0x94, 0xa2, 0xca, 0xfc, 0xa6, 0x90, 0x12, 0x24, - 0x7e, 0x48, 0x67, 0x51, 0x0b, 0x3d, 0xbf, 0x89, 0xd3, 0xe5, - 0x00, 0x37, 0x6e, 0x59, 0xdc, 0xeb, 0xb2, 0x85, 0xa5, 0x92, - 0xcb, 0xfc, 0x79, 0x4e, 0x17, 0x20, 0x57, 0x60, 0x39, 0x0e, - 0x8b, 0xbc, 0xe5, 0xd2, 0xf2, 0xc5, 0x9c, 0xab, 0x2e, 0x19, - 0x40, 0x77, 0xae, 0x99, 0xc0, 0xf7, 0x72, 0x45, 0x1c, 0x2b, - 0x0b, 0x3c, 0x65, 0x52, 0xd7, 0xe0, 0xb9, 0x8e, 0xf9, 0xce, - 0x97, 0xa0, 0x25, 0x12, 0x4b, 0x7c, 0x5c, 0x6b, 0x32, 0x05, - 0x80, 0xb7, 0xee, 0xd9, 0x41, 0x76, 0x2f, 0x18, 0x9d, 0xaa, - 0xf3, 0xc4, 0xe4, 0xd3, 0x8a, 0xbd, 0x38, 0x0f, 0x56, 0x61, - 0x16, 0x21, 0x78, 0x4f, 0xca, 0xfd, 0xa4, 0x93, 0xb3, 0x84, - 0xdd, 0xea, 0x6f, 0x58, 0x01, 0x36, 0xef, 0xd8, 0x81, 0xb6, - 0x33, 0x04, 0x5d, 0x6a, 0x4a, 0x7d, 0x24, 0x13, 0x96, 0xa1, - 0xf8, 0xcf, 0xb8, 0x8f, 0xd6, 0xe1, 0x64, 0x53, 0x0a, 0x3d, - 0x1d, 0x2a, 0x73, 0x44, 0xc1, 0xf6, 0xaf, 0x98, 0x82, 0xb5, - 0xec, 0xdb, 0x5e, 0x69, 0x30, 0x07, 0x27, 0x10, 0x49, 0x7e, - 0xfb, 0xcc, 0x95, 0xa2, 0xd5, 0xe2, 0xbb, 0x8c, 0x09, 0x3e, - 0x67, 0x50, 0x70, 0x47, 0x1e, 0x29, 0xac, 0x9b, 0xc2, 0xf5, - 0x2c, 0x1b, 0x42, 0x75, 0xf0, 0xc7, 0x9e, 0xa9, 0x89, 0xbe, - 0xe7, 0xd0, 0x55, 0x62, 0x3b, 0x0c, 0x7b, 0x4c, 0x15, 0x22, - 0xa7, 0x90, 0xc9, 0xfe, 0xde, 0xe9, 0xb0, 0x87, 0x02, 0x35, - 0x6c, 0x5b, 0xc3, 0xf4, 0xad, 0x9a, 0x1f, 0x28, 0x71, 0x46, - 0x66, 0x51, 0x08, 0x3f, 0xba, 0x8d, 0xd4, 0xe3, 0x94, 0xa3, - 0xfa, 0xcd, 0x48, 0x7f, 0x26, 0x11, 0x31, 0x06, 0x5f, 0x68, - 0xed, 0xda, 0x83, 0xb4, 0x6d, 0x5a, 0x03, 0x34, 0xb1, 0x86, - 0xdf, 0xe8, 0xc8, 0xff, 0xa6, 0x91, 0x14, 0x23, 0x7a, 0x4d, - 0x3a, 0x0d, 0x54, 0x63, 0xe6, 0xd1, 0x88, 0xbf, 0x9f, 0xa8, - 0xf1, 0xc6, 0x43, 0x74, 0x2d, 0x1a, 0x00, 0x38, 0x70, 0x48, - 0xe0, 0xd8, 0x90, 0xa8, 0xdd, 0xe5, 0xad, 0x95, 0x3d, 0x05, - 0x4d, 0x75, 0xa7, 0x9f, 0xd7, 0xef, 0x47, 0x7f, 0x37, 0x0f, - 0x7a, 0x42, 0x0a, 0x32, 0x9a, 0xa2, 0xea, 0xd2, 0x53, 0x6b, - 0x23, 0x1b, 0xb3, 0x8b, 0xc3, 0xfb, 0x8e, 0xb6, 0xfe, 0xc6, - 0x6e, 0x56, 0x1e, 0x26, 0xf4, 0xcc, 0x84, 0xbc, 0x14, 0x2c, - 0x64, 0x5c, 0x29, 0x11, 0x59, 0x61, 0xc9, 0xf1, 0xb9, 0x81, - 0xa6, 0x9e, 0xd6, 0xee, 0x46, 0x7e, 0x36, 0x0e, 0x7b, 0x43, - 0x0b, 0x33, 0x9b, 0xa3, 0xeb, 0xd3, 0x01, 0x39, 0x71, 0x49, - 0xe1, 0xd9, 0x91, 0xa9, 0xdc, 0xe4, 0xac, 0x94, 0x3c, 0x04, - 0x4c, 0x74, 0xf5, 0xcd, 0x85, 0xbd, 0x15, 0x2d, 0x65, 0x5d, - 0x28, 0x10, 0x58, 0x60, 0xc8, 0xf0, 0xb8, 0x80, 0x52, 0x6a, - 0x22, 0x1a, 0xb2, 0x8a, 0xc2, 0xfa, 0x8f, 0xb7, 0xff, 0xc7, - 0x6f, 0x57, 0x1f, 0x27, 0x51, 0x69, 0x21, 0x19, 0xb1, 0x89, - 0xc1, 0xf9, 0x8c, 0xb4, 0xfc, 0xc4, 0x6c, 0x54, 0x1c, 0x24, - 0xf6, 0xce, 0x86, 0xbe, 0x16, 0x2e, 0x66, 0x5e, 0x2b, 0x13, - 0x5b, 0x63, 0xcb, 0xf3, 0xbb, 0x83, 0x02, 0x3a, 0x72, 0x4a, - 0xe2, 0xda, 0x92, 0xaa, 0xdf, 0xe7, 0xaf, 0x97, 0x3f, 0x07, - 0x4f, 0x77, 0xa5, 0x9d, 0xd5, 0xed, 0x45, 0x7d, 0x35, 0x0d, - 0x78, 0x40, 0x08, 0x30, 0x98, 0xa0, 0xe8, 0xd0, 0xf7, 0xcf, - 0x87, 0xbf, 0x17, 0x2f, 0x67, 0x5f, 0x2a, 0x12, 0x5a, 0x62, - 0xca, 0xf2, 0xba, 0x82, 0x50, 0x68, 0x20, 0x18, 0xb0, 0x88, - 0xc0, 0xf8, 0x8d, 0xb5, 0xfd, 0xc5, 0x6d, 0x55, 0x1d, 0x25, - 0xa4, 0x9c, 0xd4, 0xec, 0x44, 0x7c, 0x34, 0x0c, 0x79, 0x41, - 0x09, 0x31, 0x99, 0xa1, 0xe9, 0xd1, 0x03, 0x3b, 0x73, 0x4b, - 0xe3, 0xdb, 0x93, 0xab, 0xde, 0xe6, 0xae, 0x96, 0x3e, 0x06, - 0x4e, 0x76, 0x00, 0x39, 0x72, 0x4b, 0xe4, 0xdd, 0x96, 0xaf, - 0xd5, 0xec, 0xa7, 0x9e, 0x31, 0x08, 0x43, 0x7a, 0xb7, 0x8e, - 0xc5, 0xfc, 0x53, 0x6a, 0x21, 0x18, 0x62, 0x5b, 0x10, 0x29, - 0x86, 0xbf, 0xf4, 0xcd, 0x73, 0x4a, 0x01, 0x38, 0x97, 0xae, - 0xe5, 0xdc, 0xa6, 0x9f, 0xd4, 0xed, 0x42, 0x7b, 0x30, 0x09, - 0xc4, 0xfd, 0xb6, 0x8f, 0x20, 0x19, 0x52, 0x6b, 0x11, 0x28, - 0x63, 0x5a, 0xf5, 0xcc, 0x87, 0xbe, 0xe6, 0xdf, 0x94, 0xad, - 0x02, 0x3b, 0x70, 0x49, 0x33, 0x0a, 0x41, 0x78, 0xd7, 0xee, - 0xa5, 0x9c, 0x51, 0x68, 0x23, 0x1a, 0xb5, 0x8c, 0xc7, 0xfe, - 0x84, 0xbd, 0xf6, 0xcf, 0x60, 0x59, 0x12, 0x2b, 0x95, 0xac, - 0xe7, 0xde, 0x71, 0x48, 0x03, 0x3a, 0x40, 0x79, 0x32, 0x0b, - 0xa4, 0x9d, 0xd6, 0xef, 0x22, 0x1b, 0x50, 0x69, 0xc6, 0xff, - 0xb4, 0x8d, 0xf7, 0xce, 0x85, 0xbc, 0x13, 0x2a, 0x61, 0x58, - 0xd1, 0xe8, 0xa3, 0x9a, 0x35, 0x0c, 0x47, 0x7e, 0x04, 0x3d, - 0x76, 0x4f, 0xe0, 0xd9, 0x92, 0xab, 0x66, 0x5f, 0x14, 0x2d, - 0x82, 0xbb, 0xf0, 0xc9, 0xb3, 0x8a, 0xc1, 0xf8, 0x57, 0x6e, - 0x25, 0x1c, 0xa2, 0x9b, 0xd0, 0xe9, 0x46, 0x7f, 0x34, 0x0d, - 0x77, 0x4e, 0x05, 0x3c, 0x93, 0xaa, 0xe1, 0xd8, 0x15, 0x2c, - 0x67, 0x5e, 0xf1, 0xc8, 0x83, 0xba, 0xc0, 0xf9, 0xb2, 0x8b, - 0x24, 0x1d, 0x56, 0x6f, 0x37, 0x0e, 0x45, 0x7c, 0xd3, 0xea, - 0xa1, 0x98, 0xe2, 0xdb, 0x90, 0xa9, 0x06, 0x3f, 0x74, 0x4d, - 0x80, 0xb9, 0xf2, 0xcb, 0x64, 0x5d, 0x16, 0x2f, 0x55, 0x6c, - 0x27, 0x1e, 0xb1, 0x88, 0xc3, 0xfa, 0x44, 0x7d, 0x36, 0x0f, - 0xa0, 0x99, 0xd2, 0xeb, 0x91, 0xa8, 0xe3, 0xda, 0x75, 0x4c, - 0x07, 0x3e, 0xf3, 0xca, 0x81, 0xb8, 0x17, 0x2e, 0x65, 0x5c, - 0x26, 0x1f, 0x54, 0x6d, 0xc2, 0xfb, 0xb0, 0x89, 0x00, 0x3a, - 0x74, 0x4e, 0xe8, 0xd2, 0x9c, 0xa6, 0xcd, 0xf7, 0xb9, 0x83, - 0x25, 0x1f, 0x51, 0x6b, 0x87, 0xbd, 0xf3, 0xc9, 0x6f, 0x55, - 0x1b, 0x21, 0x4a, 0x70, 0x3e, 0x04, 0xa2, 0x98, 0xd6, 0xec, - 0x13, 0x29, 0x67, 0x5d, 0xfb, 0xc1, 0x8f, 0xb5, 0xde, 0xe4, - 0xaa, 0x90, 0x36, 0x0c, 0x42, 0x78, 0x94, 0xae, 0xe0, 0xda, - 0x7c, 0x46, 0x08, 0x32, 0x59, 0x63, 0x2d, 0x17, 0xb1, 0x8b, - 0xc5, 0xff, 0x26, 0x1c, 0x52, 0x68, 0xce, 0xf4, 0xba, 0x80, - 0xeb, 0xd1, 0x9f, 0xa5, 0x03, 0x39, 0x77, 0x4d, 0xa1, 0x9b, - 0xd5, 0xef, 0x49, 0x73, 0x3d, 0x07, 0x6c, 0x56, 0x18, 0x22, - 0x84, 0xbe, 0xf0, 0xca, 0x35, 0x0f, 0x41, 0x7b, 0xdd, 0xe7, - 0xa9, 0x93, 0xf8, 0xc2, 0x8c, 0xb6, 0x10, 0x2a, 0x64, 0x5e, - 0xb2, 0x88, 0xc6, 0xfc, 0x5a, 0x60, 0x2e, 0x14, 0x7f, 0x45, - 0x0b, 0x31, 0x97, 0xad, 0xe3, 0xd9, 0x4c, 0x76, 0x38, 0x02, - 0xa4, 0x9e, 0xd0, 0xea, 0x81, 0xbb, 0xf5, 0xcf, 0x69, 0x53, - 0x1d, 0x27, 0xcb, 0xf1, 0xbf, 0x85, 0x23, 0x19, 0x57, 0x6d, - 0x06, 0x3c, 0x72, 0x48, 0xee, 0xd4, 0x9a, 0xa0, 0x5f, 0x65, - 0x2b, 0x11, 0xb7, 0x8d, 0xc3, 0xf9, 0x92, 0xa8, 0xe6, 0xdc, - 0x7a, 0x40, 0x0e, 0x34, 0xd8, 0xe2, 0xac, 0x96, 0x30, 0x0a, - 0x44, 0x7e, 0x15, 0x2f, 0x61, 0x5b, 0xfd, 0xc7, 0x89, 0xb3, - 0x6a, 0x50, 0x1e, 0x24, 0x82, 0xb8, 0xf6, 0xcc, 0xa7, 0x9d, - 0xd3, 0xe9, 0x4f, 0x75, 0x3b, 0x01, 0xed, 0xd7, 0x99, 0xa3, - 0x05, 0x3f, 0x71, 0x4b, 0x20, 0x1a, 0x54, 0x6e, 0xc8, 0xf2, - 0xbc, 0x86, 0x79, 0x43, 0x0d, 0x37, 0x91, 0xab, 0xe5, 0xdf, - 0xb4, 0x8e, 0xc0, 0xfa, 0x5c, 0x66, 0x28, 0x12, 0xfe, 0xc4, - 0x8a, 0xb0, 0x16, 0x2c, 0x62, 0x58, 0x33, 0x09, 0x47, 0x7d, - 0xdb, 0xe1, 0xaf, 0x95, 0x00, 0x3b, 0x76, 0x4d, 0xec, 0xd7, - 0x9a, 0xa1, 0xc5, 0xfe, 0xb3, 0x88, 0x29, 0x12, 0x5f, 0x64, - 0x97, 0xac, 0xe1, 0xda, 0x7b, 0x40, 0x0d, 0x36, 0x52, 0x69, - 0x24, 0x1f, 0xbe, 0x85, 0xc8, 0xf3, 0x33, 0x08, 0x45, 0x7e, - 0xdf, 0xe4, 0xa9, 0x92, 0xf6, 0xcd, 0x80, 0xbb, 0x1a, 0x21, - 0x6c, 0x57, 0xa4, 0x9f, 0xd2, 0xe9, 0x48, 0x73, 0x3e, 0x05, - 0x61, 0x5a, 0x17, 0x2c, 0x8d, 0xb6, 0xfb, 0xc0, 0x66, 0x5d, - 0x10, 0x2b, 0x8a, 0xb1, 0xfc, 0xc7, 0xa3, 0x98, 0xd5, 0xee, - 0x4f, 0x74, 0x39, 0x02, 0xf1, 0xca, 0x87, 0xbc, 0x1d, 0x26, - 0x6b, 0x50, 0x34, 0x0f, 0x42, 0x79, 0xd8, 0xe3, 0xae, 0x95, - 0x55, 0x6e, 0x23, 0x18, 0xb9, 0x82, 0xcf, 0xf4, 0x90, 0xab, - 0xe6, 0xdd, 0x7c, 0x47, 0x0a, 0x31, 0xc2, 0xf9, 0xb4, 0x8f, - 0x2e, 0x15, 0x58, 0x63, 0x07, 0x3c, 0x71, 0x4a, 0xeb, 0xd0, - 0x9d, 0xa6, 0xcc, 0xf7, 0xba, 0x81, 0x20, 0x1b, 0x56, 0x6d, - 0x09, 0x32, 0x7f, 0x44, 0xe5, 0xde, 0x93, 0xa8, 0x5b, 0x60, - 0x2d, 0x16, 0xb7, 0x8c, 0xc1, 0xfa, 0x9e, 0xa5, 0xe8, 0xd3, - 0x72, 0x49, 0x04, 0x3f, 0xff, 0xc4, 0x89, 0xb2, 0x13, 0x28, - 0x65, 0x5e, 0x3a, 0x01, 0x4c, 0x77, 0xd6, 0xed, 0xa0, 0x9b, - 0x68, 0x53, 0x1e, 0x25, 0x84, 0xbf, 0xf2, 0xc9, 0xad, 0x96, - 0xdb, 0xe0, 0x41, 0x7a, 0x37, 0x0c, 0xaa, 0x91, 0xdc, 0xe7, - 0x46, 0x7d, 0x30, 0x0b, 0x6f, 0x54, 0x19, 0x22, 0x83, 0xb8, - 0xf5, 0xce, 0x3d, 0x06, 0x4b, 0x70, 0xd1, 0xea, 0xa7, 0x9c, - 0xf8, 0xc3, 0x8e, 0xb5, 0x14, 0x2f, 0x62, 0x59, 0x99, 0xa2, - 0xef, 0xd4, 0x75, 0x4e, 0x03, 0x38, 0x5c, 0x67, 0x2a, 0x11, - 0xb0, 0x8b, 0xc6, 0xfd, 0x0e, 0x35, 0x78, 0x43, 0xe2, 0xd9, - 0x94, 0xaf, 0xcb, 0xf0, 0xbd, 0x86, 0x27, 0x1c, 0x51, 0x6a, - 0x00, 0x3c, 0x78, 0x44, 0xf0, 0xcc, 0x88, 0xb4, 0xfd, 0xc1, - 0x85, 0xb9, 0x0d, 0x31, 0x75, 0x49, 0xe7, 0xdb, 0x9f, 0xa3, - 0x17, 0x2b, 0x6f, 0x53, 0x1a, 0x26, 0x62, 0x5e, 0xea, 0xd6, - 0x92, 0xae, 0xd3, 0xef, 0xab, 0x97, 0x23, 0x1f, 0x5b, 0x67, - 0x2e, 0x12, 0x56, 0x6a, 0xde, 0xe2, 0xa6, 0x9a, 0x34, 0x08, - 0x4c, 0x70, 0xc4, 0xf8, 0xbc, 0x80, 0xc9, 0xf5, 0xb1, 0x8d, - 0x39, 0x05, 0x41, 0x7d, 0xbb, 0x87, 0xc3, 0xff, 0x4b, 0x77, - 0x33, 0x0f, 0x46, 0x7a, 0x3e, 0x02, 0xb6, 0x8a, 0xce, 0xf2, - 0x5c, 0x60, 0x24, 0x18, 0xac, 0x90, 0xd4, 0xe8, 0xa1, 0x9d, - 0xd9, 0xe5, 0x51, 0x6d, 0x29, 0x15, 0x68, 0x54, 0x10, 0x2c, - 0x98, 0xa4, 0xe0, 0xdc, 0x95, 0xa9, 0xed, 0xd1, 0x65, 0x59, - 0x1d, 0x21, 0x8f, 0xb3, 0xf7, 0xcb, 0x7f, 0x43, 0x07, 0x3b, - 0x72, 0x4e, 0x0a, 0x36, 0x82, 0xbe, 0xfa, 0xc6, 0x6b, 0x57, - 0x13, 0x2f, 0x9b, 0xa7, 0xe3, 0xdf, 0x96, 0xaa, 0xee, 0xd2, - 0x66, 0x5a, 0x1e, 0x22, 0x8c, 0xb0, 0xf4, 0xc8, 0x7c, 0x40, - 0x04, 0x38, 0x71, 0x4d, 0x09, 0x35, 0x81, 0xbd, 0xf9, 0xc5, - 0xb8, 0x84, 0xc0, 0xfc, 0x48, 0x74, 0x30, 0x0c, 0x45, 0x79, - 0x3d, 0x01, 0xb5, 0x89, 0xcd, 0xf1, 0x5f, 0x63, 0x27, 0x1b, - 0xaf, 0x93, 0xd7, 0xeb, 0xa2, 0x9e, 0xda, 0xe6, 0x52, 0x6e, - 0x2a, 0x16, 0xd0, 0xec, 0xa8, 0x94, 0x20, 0x1c, 0x58, 0x64, - 0x2d, 0x11, 0x55, 0x69, 0xdd, 0xe1, 0xa5, 0x99, 0x37, 0x0b, - 0x4f, 0x73, 0xc7, 0xfb, 0xbf, 0x83, 0xca, 0xf6, 0xb2, 0x8e, - 0x3a, 0x06, 0x42, 0x7e, 0x03, 0x3f, 0x7b, 0x47, 0xf3, 0xcf, - 0x8b, 0xb7, 0xfe, 0xc2, 0x86, 0xba, 0x0e, 0x32, 0x76, 0x4a, - 0xe4, 0xd8, 0x9c, 0xa0, 0x14, 0x28, 0x6c, 0x50, 0x19, 0x25, - 0x61, 0x5d, 0xe9, 0xd5, 0x91, 0xad, 0x00, 0x3d, 0x7a, 0x47, - 0xf4, 0xc9, 0x8e, 0xb3, 0xf5, 0xc8, 0x8f, 0xb2, 0x01, 0x3c, - 0x7b, 0x46, 0xf7, 0xca, 0x8d, 0xb0, 0x03, 0x3e, 0x79, 0x44, - 0x02, 0x3f, 0x78, 0x45, 0xf6, 0xcb, 0x8c, 0xb1, 0xf3, 0xce, - 0x89, 0xb4, 0x07, 0x3a, 0x7d, 0x40, 0x06, 0x3b, 0x7c, 0x41, - 0xf2, 0xcf, 0x88, 0xb5, 0x04, 0x39, 0x7e, 0x43, 0xf0, 0xcd, - 0x8a, 0xb7, 0xf1, 0xcc, 0x8b, 0xb6, 0x05, 0x38, 0x7f, 0x42, - 0xfb, 0xc6, 0x81, 0xbc, 0x0f, 0x32, 0x75, 0x48, 0x0e, 0x33, - 0x74, 0x49, 0xfa, 0xc7, 0x80, 0xbd, 0x0c, 0x31, 0x76, 0x4b, - 0xf8, 0xc5, 0x82, 0xbf, 0xf9, 0xc4, 0x83, 0xbe, 0x0d, 0x30, - 0x77, 0x4a, 0x08, 0x35, 0x72, 0x4f, 0xfc, 0xc1, 0x86, 0xbb, - 0xfd, 0xc0, 0x87, 0xba, 0x09, 0x34, 0x73, 0x4e, 0xff, 0xc2, - 0x85, 0xb8, 0x0b, 0x36, 0x71, 0x4c, 0x0a, 0x37, 0x70, 0x4d, - 0xfe, 0xc3, 0x84, 0xb9, 0xeb, 0xd6, 0x91, 0xac, 0x1f, 0x22, - 0x65, 0x58, 0x1e, 0x23, 0x64, 0x59, 0xea, 0xd7, 0x90, 0xad, - 0x1c, 0x21, 0x66, 0x5b, 0xe8, 0xd5, 0x92, 0xaf, 0xe9, 0xd4, - 0x93, 0xae, 0x1d, 0x20, 0x67, 0x5a, 0x18, 0x25, 0x62, 0x5f, - 0xec, 0xd1, 0x96, 0xab, 0xed, 0xd0, 0x97, 0xaa, 0x19, 0x24, - 0x63, 0x5e, 0xef, 0xd2, 0x95, 0xa8, 0x1b, 0x26, 0x61, 0x5c, - 0x1a, 0x27, 0x60, 0x5d, 0xee, 0xd3, 0x94, 0xa9, 0x10, 0x2d, - 0x6a, 0x57, 0xe4, 0xd9, 0x9e, 0xa3, 0xe5, 0xd8, 0x9f, 0xa2, - 0x11, 0x2c, 0x6b, 0x56, 0xe7, 0xda, 0x9d, 0xa0, 0x13, 0x2e, - 0x69, 0x54, 0x12, 0x2f, 0x68, 0x55, 0xe6, 0xdb, 0x9c, 0xa1, - 0xe3, 0xde, 0x99, 0xa4, 0x17, 0x2a, 0x6d, 0x50, 0x16, 0x2b, - 0x6c, 0x51, 0xe2, 0xdf, 0x98, 0xa5, 0x14, 0x29, 0x6e, 0x53, - 0xe0, 0xdd, 0x9a, 0xa7, 0xe1, 0xdc, 0x9b, 0xa6, 0x15, 0x28, - 0x6f, 0x52, 0x00, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, - 0xed, 0xd3, 0x91, 0xaf, 0x15, 0x2b, 0x69, 0x57, 0xc7, 0xf9, - 0xbb, 0x85, 0x3f, 0x01, 0x43, 0x7d, 0x2a, 0x14, 0x56, 0x68, - 0xd2, 0xec, 0xae, 0x90, 0x93, 0xad, 0xef, 0xd1, 0x6b, 0x55, - 0x17, 0x29, 0x7e, 0x40, 0x02, 0x3c, 0x86, 0xb8, 0xfa, 0xc4, - 0x54, 0x6a, 0x28, 0x16, 0xac, 0x92, 0xd0, 0xee, 0xb9, 0x87, - 0xc5, 0xfb, 0x41, 0x7f, 0x3d, 0x03, 0x3b, 0x05, 0x47, 0x79, - 0xc3, 0xfd, 0xbf, 0x81, 0xd6, 0xe8, 0xaa, 0x94, 0x2e, 0x10, - 0x52, 0x6c, 0xfc, 0xc2, 0x80, 0xbe, 0x04, 0x3a, 0x78, 0x46, - 0x11, 0x2f, 0x6d, 0x53, 0xe9, 0xd7, 0x95, 0xab, 0xa8, 0x96, - 0xd4, 0xea, 0x50, 0x6e, 0x2c, 0x12, 0x45, 0x7b, 0x39, 0x07, - 0xbd, 0x83, 0xc1, 0xff, 0x6f, 0x51, 0x13, 0x2d, 0x97, 0xa9, - 0xeb, 0xd5, 0x82, 0xbc, 0xfe, 0xc0, 0x7a, 0x44, 0x06, 0x38, - 0x76, 0x48, 0x0a, 0x34, 0x8e, 0xb0, 0xf2, 0xcc, 0x9b, 0xa5, - 0xe7, 0xd9, 0x63, 0x5d, 0x1f, 0x21, 0xb1, 0x8f, 0xcd, 0xf3, - 0x49, 0x77, 0x35, 0x0b, 0x5c, 0x62, 0x20, 0x1e, 0xa4, 0x9a, - 0xd8, 0xe6, 0xe5, 0xdb, 0x99, 0xa7, 0x1d, 0x23, 0x61, 0x5f, - 0x08, 0x36, 0x74, 0x4a, 0xf0, 0xce, 0x8c, 0xb2, 0x22, 0x1c, - 0x5e, 0x60, 0xda, 0xe4, 0xa6, 0x98, 0xcf, 0xf1, 0xb3, 0x8d, - 0x37, 0x09, 0x4b, 0x75, 0x4d, 0x73, 0x31, 0x0f, 0xb5, 0x8b, - 0xc9, 0xf7, 0xa0, 0x9e, 0xdc, 0xe2, 0x58, 0x66, 0x24, 0x1a, - 0x8a, 0xb4, 0xf6, 0xc8, 0x72, 0x4c, 0x0e, 0x30, 0x67, 0x59, - 0x1b, 0x25, 0x9f, 0xa1, 0xe3, 0xdd, 0xde, 0xe0, 0xa2, 0x9c, - 0x26, 0x18, 0x5a, 0x64, 0x33, 0x0d, 0x4f, 0x71, 0xcb, 0xf5, - 0xb7, 0x89, 0x19, 0x27, 0x65, 0x5b, 0xe1, 0xdf, 0x9d, 0xa3, - 0xf4, 0xca, 0x88, 0xb6, 0x0c, 0x32, 0x70, 0x4e, 0x00, 0x3f, - 0x7e, 0x41, 0xfc, 0xc3, 0x82, 0xbd, 0xe5, 0xda, 0x9b, 0xa4, - 0x19, 0x26, 0x67, 0x58, 0xd7, 0xe8, 0xa9, 0x96, 0x2b, 0x14, - 0x55, 0x6a, 0x32, 0x0d, 0x4c, 0x73, 0xce, 0xf1, 0xb0, 0x8f, - 0xb3, 0x8c, 0xcd, 0xf2, 0x4f, 0x70, 0x31, 0x0e, 0x56, 0x69, - 0x28, 0x17, 0xaa, 0x95, 0xd4, 0xeb, 0x64, 0x5b, 0x1a, 0x25, - 0x98, 0xa7, 0xe6, 0xd9, 0x81, 0xbe, 0xff, 0xc0, 0x7d, 0x42, - 0x03, 0x3c, 0x7b, 0x44, 0x05, 0x3a, 0x87, 0xb8, 0xf9, 0xc6, - 0x9e, 0xa1, 0xe0, 0xdf, 0x62, 0x5d, 0x1c, 0x23, 0xac, 0x93, - 0xd2, 0xed, 0x50, 0x6f, 0x2e, 0x11, 0x49, 0x76, 0x37, 0x08, - 0xb5, 0x8a, 0xcb, 0xf4, 0xc8, 0xf7, 0xb6, 0x89, 0x34, 0x0b, - 0x4a, 0x75, 0x2d, 0x12, 0x53, 0x6c, 0xd1, 0xee, 0xaf, 0x90, - 0x1f, 0x20, 0x61, 0x5e, 0xe3, 0xdc, 0x9d, 0xa2, 0xfa, 0xc5, - 0x84, 0xbb, 0x06, 0x39, 0x78, 0x47, 0xf6, 0xc9, 0x88, 0xb7, - 0x0a, 0x35, 0x74, 0x4b, 0x13, 0x2c, 0x6d, 0x52, 0xef, 0xd0, - 0x91, 0xae, 0x21, 0x1e, 0x5f, 0x60, 0xdd, 0xe2, 0xa3, 0x9c, - 0xc4, 0xfb, 0xba, 0x85, 0x38, 0x07, 0x46, 0x79, 0x45, 0x7a, - 0x3b, 0x04, 0xb9, 0x86, 0xc7, 0xf8, 0xa0, 0x9f, 0xde, 0xe1, - 0x5c, 0x63, 0x22, 0x1d, 0x92, 0xad, 0xec, 0xd3, 0x6e, 0x51, - 0x10, 0x2f, 0x77, 0x48, 0x09, 0x36, 0x8b, 0xb4, 0xf5, 0xca, - 0x8d, 0xb2, 0xf3, 0xcc, 0x71, 0x4e, 0x0f, 0x30, 0x68, 0x57, - 0x16, 0x29, 0x94, 0xab, 0xea, 0xd5, 0x5a, 0x65, 0x24, 0x1b, - 0xa6, 0x99, 0xd8, 0xe7, 0xbf, 0x80, 0xc1, 0xfe, 0x43, 0x7c, - 0x3d, 0x02, 0x3e, 0x01, 0x40, 0x7f, 0xc2, 0xfd, 0xbc, 0x83, - 0xdb, 0xe4, 0xa5, 0x9a, 0x27, 0x18, 0x59, 0x66, 0xe9, 0xd6, - 0x97, 0xa8, 0x15, 0x2a, 0x6b, 0x54, 0x0c, 0x33, 0x72, 0x4d, - 0xf0, 0xcf, 0x8e, 0xb1, 0x00, 0x40, 0x80, 0xc0, 0x1d, 0x5d, - 0x9d, 0xdd, 0x3a, 0x7a, 0xba, 0xfa, 0x27, 0x67, 0xa7, 0xe7, - 0x74, 0x34, 0xf4, 0xb4, 0x69, 0x29, 0xe9, 0xa9, 0x4e, 0x0e, - 0xce, 0x8e, 0x53, 0x13, 0xd3, 0x93, 0xe8, 0xa8, 0x68, 0x28, - 0xf5, 0xb5, 0x75, 0x35, 0xd2, 0x92, 0x52, 0x12, 0xcf, 0x8f, - 0x4f, 0x0f, 0x9c, 0xdc, 0x1c, 0x5c, 0x81, 0xc1, 0x01, 0x41, - 0xa6, 0xe6, 0x26, 0x66, 0xbb, 0xfb, 0x3b, 0x7b, 0xcd, 0x8d, - 0x4d, 0x0d, 0xd0, 0x90, 0x50, 0x10, 0xf7, 0xb7, 0x77, 0x37, - 0xea, 0xaa, 0x6a, 0x2a, 0xb9, 0xf9, 0x39, 0x79, 0xa4, 0xe4, - 0x24, 0x64, 0x83, 0xc3, 0x03, 0x43, 0x9e, 0xde, 0x1e, 0x5e, - 0x25, 0x65, 0xa5, 0xe5, 0x38, 0x78, 0xb8, 0xf8, 0x1f, 0x5f, - 0x9f, 0xdf, 0x02, 0x42, 0x82, 0xc2, 0x51, 0x11, 0xd1, 0x91, - 0x4c, 0x0c, 0xcc, 0x8c, 0x6b, 0x2b, 0xeb, 0xab, 0x76, 0x36, - 0xf6, 0xb6, 0x87, 0xc7, 0x07, 0x47, 0x9a, 0xda, 0x1a, 0x5a, - 0xbd, 0xfd, 0x3d, 0x7d, 0xa0, 0xe0, 0x20, 0x60, 0xf3, 0xb3, - 0x73, 0x33, 0xee, 0xae, 0x6e, 0x2e, 0xc9, 0x89, 0x49, 0x09, - 0xd4, 0x94, 0x54, 0x14, 0x6f, 0x2f, 0xef, 0xaf, 0x72, 0x32, - 0xf2, 0xb2, 0x55, 0x15, 0xd5, 0x95, 0x48, 0x08, 0xc8, 0x88, - 0x1b, 0x5b, 0x9b, 0xdb, 0x06, 0x46, 0x86, 0xc6, 0x21, 0x61, - 0xa1, 0xe1, 0x3c, 0x7c, 0xbc, 0xfc, 0x4a, 0x0a, 0xca, 0x8a, - 0x57, 0x17, 0xd7, 0x97, 0x70, 0x30, 0xf0, 0xb0, 0x6d, 0x2d, - 0xed, 0xad, 0x3e, 0x7e, 0xbe, 0xfe, 0x23, 0x63, 0xa3, 0xe3, - 0x04, 0x44, 0x84, 0xc4, 0x19, 0x59, 0x99, 0xd9, 0xa2, 0xe2, - 0x22, 0x62, 0xbf, 0xff, 0x3f, 0x7f, 0x98, 0xd8, 0x18, 0x58, - 0x85, 0xc5, 0x05, 0x45, 0xd6, 0x96, 0x56, 0x16, 0xcb, 0x8b, - 0x4b, 0x0b, 0xec, 0xac, 0x6c, 0x2c, 0xf1, 0xb1, 0x71, 0x31, - 0x00, 0x41, 0x82, 0xc3, 0x19, 0x58, 0x9b, 0xda, 0x32, 0x73, - 0xb0, 0xf1, 0x2b, 0x6a, 0xa9, 0xe8, 0x64, 0x25, 0xe6, 0xa7, - 0x7d, 0x3c, 0xff, 0xbe, 0x56, 0x17, 0xd4, 0x95, 0x4f, 0x0e, - 0xcd, 0x8c, 0xc8, 0x89, 0x4a, 0x0b, 0xd1, 0x90, 0x53, 0x12, - 0xfa, 0xbb, 0x78, 0x39, 0xe3, 0xa2, 0x61, 0x20, 0xac, 0xed, - 0x2e, 0x6f, 0xb5, 0xf4, 0x37, 0x76, 0x9e, 0xdf, 0x1c, 0x5d, - 0x87, 0xc6, 0x05, 0x44, 0x8d, 0xcc, 0x0f, 0x4e, 0x94, 0xd5, - 0x16, 0x57, 0xbf, 0xfe, 0x3d, 0x7c, 0xa6, 0xe7, 0x24, 0x65, - 0xe9, 0xa8, 0x6b, 0x2a, 0xf0, 0xb1, 0x72, 0x33, 0xdb, 0x9a, - 0x59, 0x18, 0xc2, 0x83, 0x40, 0x01, 0x45, 0x04, 0xc7, 0x86, - 0x5c, 0x1d, 0xde, 0x9f, 0x77, 0x36, 0xf5, 0xb4, 0x6e, 0x2f, - 0xec, 0xad, 0x21, 0x60, 0xa3, 0xe2, 0x38, 0x79, 0xba, 0xfb, - 0x13, 0x52, 0x91, 0xd0, 0x0a, 0x4b, 0x88, 0xc9, 0x07, 0x46, - 0x85, 0xc4, 0x1e, 0x5f, 0x9c, 0xdd, 0x35, 0x74, 0xb7, 0xf6, - 0x2c, 0x6d, 0xae, 0xef, 0x63, 0x22, 0xe1, 0xa0, 0x7a, 0x3b, - 0xf8, 0xb9, 0x51, 0x10, 0xd3, 0x92, 0x48, 0x09, 0xca, 0x8b, - 0xcf, 0x8e, 0x4d, 0x0c, 0xd6, 0x97, 0x54, 0x15, 0xfd, 0xbc, - 0x7f, 0x3e, 0xe4, 0xa5, 0x66, 0x27, 0xab, 0xea, 0x29, 0x68, - 0xb2, 0xf3, 0x30, 0x71, 0x99, 0xd8, 0x1b, 0x5a, 0x80, 0xc1, - 0x02, 0x43, 0x8a, 0xcb, 0x08, 0x49, 0x93, 0xd2, 0x11, 0x50, - 0xb8, 0xf9, 0x3a, 0x7b, 0xa1, 0xe0, 0x23, 0x62, 0xee, 0xaf, - 0x6c, 0x2d, 0xf7, 0xb6, 0x75, 0x34, 0xdc, 0x9d, 0x5e, 0x1f, - 0xc5, 0x84, 0x47, 0x06, 0x42, 0x03, 0xc0, 0x81, 0x5b, 0x1a, - 0xd9, 0x98, 0x70, 0x31, 0xf2, 0xb3, 0x69, 0x28, 0xeb, 0xaa, - 0x26, 0x67, 0xa4, 0xe5, 0x3f, 0x7e, 0xbd, 0xfc, 0x14, 0x55, - 0x96, 0xd7, 0x0d, 0x4c, 0x8f, 0xce, 0x00, 0x42, 0x84, 0xc6, - 0x15, 0x57, 0x91, 0xd3, 0x2a, 0x68, 0xae, 0xec, 0x3f, 0x7d, - 0xbb, 0xf9, 0x54, 0x16, 0xd0, 0x92, 0x41, 0x03, 0xc5, 0x87, - 0x7e, 0x3c, 0xfa, 0xb8, 0x6b, 0x29, 0xef, 0xad, 0xa8, 0xea, - 0x2c, 0x6e, 0xbd, 0xff, 0x39, 0x7b, 0x82, 0xc0, 0x06, 0x44, - 0x97, 0xd5, 0x13, 0x51, 0xfc, 0xbe, 0x78, 0x3a, 0xe9, 0xab, - 0x6d, 0x2f, 0xd6, 0x94, 0x52, 0x10, 0xc3, 0x81, 0x47, 0x05, - 0x4d, 0x0f, 0xc9, 0x8b, 0x58, 0x1a, 0xdc, 0x9e, 0x67, 0x25, - 0xe3, 0xa1, 0x72, 0x30, 0xf6, 0xb4, 0x19, 0x5b, 0x9d, 0xdf, - 0x0c, 0x4e, 0x88, 0xca, 0x33, 0x71, 0xb7, 0xf5, 0x26, 0x64, - 0xa2, 0xe0, 0xe5, 0xa7, 0x61, 0x23, 0xf0, 0xb2, 0x74, 0x36, - 0xcf, 0x8d, 0x4b, 0x09, 0xda, 0x98, 0x5e, 0x1c, 0xb1, 0xf3, - 0x35, 0x77, 0xa4, 0xe6, 0x20, 0x62, 0x9b, 0xd9, 0x1f, 0x5d, - 0x8e, 0xcc, 0x0a, 0x48, 0x9a, 0xd8, 0x1e, 0x5c, 0x8f, 0xcd, - 0x0b, 0x49, 0xb0, 0xf2, 0x34, 0x76, 0xa5, 0xe7, 0x21, 0x63, - 0xce, 0x8c, 0x4a, 0x08, 0xdb, 0x99, 0x5f, 0x1d, 0xe4, 0xa6, - 0x60, 0x22, 0xf1, 0xb3, 0x75, 0x37, 0x32, 0x70, 0xb6, 0xf4, - 0x27, 0x65, 0xa3, 0xe1, 0x18, 0x5a, 0x9c, 0xde, 0x0d, 0x4f, - 0x89, 0xcb, 0x66, 0x24, 0xe2, 0xa0, 0x73, 0x31, 0xf7, 0xb5, - 0x4c, 0x0e, 0xc8, 0x8a, 0x59, 0x1b, 0xdd, 0x9f, 0xd7, 0x95, - 0x53, 0x11, 0xc2, 0x80, 0x46, 0x04, 0xfd, 0xbf, 0x79, 0x3b, - 0xe8, 0xaa, 0x6c, 0x2e, 0x83, 0xc1, 0x07, 0x45, 0x96, 0xd4, - 0x12, 0x50, 0xa9, 0xeb, 0x2d, 0x6f, 0xbc, 0xfe, 0x38, 0x7a, - 0x7f, 0x3d, 0xfb, 0xb9, 0x6a, 0x28, 0xee, 0xac, 0x55, 0x17, - 0xd1, 0x93, 0x40, 0x02, 0xc4, 0x86, 0x2b, 0x69, 0xaf, 0xed, - 0x3e, 0x7c, 0xba, 0xf8, 0x01, 0x43, 0x85, 0xc7, 0x14, 0x56, - 0x90, 0xd2, 0x00, 0x43, 0x86, 0xc5, 0x11, 0x52, 0x97, 0xd4, - 0x22, 0x61, 0xa4, 0xe7, 0x33, 0x70, 0xb5, 0xf6, 0x44, 0x07, - 0xc2, 0x81, 0x55, 0x16, 0xd3, 0x90, 0x66, 0x25, 0xe0, 0xa3, - 0x77, 0x34, 0xf1, 0xb2, 0x88, 0xcb, 0x0e, 0x4d, 0x99, 0xda, - 0x1f, 0x5c, 0xaa, 0xe9, 0x2c, 0x6f, 0xbb, 0xf8, 0x3d, 0x7e, - 0xcc, 0x8f, 0x4a, 0x09, 0xdd, 0x9e, 0x5b, 0x18, 0xee, 0xad, - 0x68, 0x2b, 0xff, 0xbc, 0x79, 0x3a, 0x0d, 0x4e, 0x8b, 0xc8, - 0x1c, 0x5f, 0x9a, 0xd9, 0x2f, 0x6c, 0xa9, 0xea, 0x3e, 0x7d, - 0xb8, 0xfb, 0x49, 0x0a, 0xcf, 0x8c, 0x58, 0x1b, 0xde, 0x9d, - 0x6b, 0x28, 0xed, 0xae, 0x7a, 0x39, 0xfc, 0xbf, 0x85, 0xc6, - 0x03, 0x40, 0x94, 0xd7, 0x12, 0x51, 0xa7, 0xe4, 0x21, 0x62, - 0xb6, 0xf5, 0x30, 0x73, 0xc1, 0x82, 0x47, 0x04, 0xd0, 0x93, - 0x56, 0x15, 0xe3, 0xa0, 0x65, 0x26, 0xf2, 0xb1, 0x74, 0x37, - 0x1a, 0x59, 0x9c, 0xdf, 0x0b, 0x48, 0x8d, 0xce, 0x38, 0x7b, - 0xbe, 0xfd, 0x29, 0x6a, 0xaf, 0xec, 0x5e, 0x1d, 0xd8, 0x9b, - 0x4f, 0x0c, 0xc9, 0x8a, 0x7c, 0x3f, 0xfa, 0xb9, 0x6d, 0x2e, - 0xeb, 0xa8, 0x92, 0xd1, 0x14, 0x57, 0x83, 0xc0, 0x05, 0x46, - 0xb0, 0xf3, 0x36, 0x75, 0xa1, 0xe2, 0x27, 0x64, 0xd6, 0x95, - 0x50, 0x13, 0xc7, 0x84, 0x41, 0x02, 0xf4, 0xb7, 0x72, 0x31, - 0xe5, 0xa6, 0x63, 0x20, 0x17, 0x54, 0x91, 0xd2, 0x06, 0x45, - 0x80, 0xc3, 0x35, 0x76, 0xb3, 0xf0, 0x24, 0x67, 0xa2, 0xe1, - 0x53, 0x10, 0xd5, 0x96, 0x42, 0x01, 0xc4, 0x87, 0x71, 0x32, - 0xf7, 0xb4, 0x60, 0x23, 0xe6, 0xa5, 0x9f, 0xdc, 0x19, 0x5a, - 0x8e, 0xcd, 0x08, 0x4b, 0xbd, 0xfe, 0x3b, 0x78, 0xac, 0xef, - 0x2a, 0x69, 0xdb, 0x98, 0x5d, 0x1e, 0xca, 0x89, 0x4c, 0x0f, - 0xf9, 0xba, 0x7f, 0x3c, 0xe8, 0xab, 0x6e, 0x2d, 0x00, 0x44, - 0x88, 0xcc, 0x0d, 0x49, 0x85, 0xc1, 0x1a, 0x5e, 0x92, 0xd6, - 0x17, 0x53, 0x9f, 0xdb, 0x34, 0x70, 0xbc, 0xf8, 0x39, 0x7d, - 0xb1, 0xf5, 0x2e, 0x6a, 0xa6, 0xe2, 0x23, 0x67, 0xab, 0xef, - 0x68, 0x2c, 0xe0, 0xa4, 0x65, 0x21, 0xed, 0xa9, 0x72, 0x36, - 0xfa, 0xbe, 0x7f, 0x3b, 0xf7, 0xb3, 0x5c, 0x18, 0xd4, 0x90, - 0x51, 0x15, 0xd9, 0x9d, 0x46, 0x02, 0xce, 0x8a, 0x4b, 0x0f, - 0xc3, 0x87, 0xd0, 0x94, 0x58, 0x1c, 0xdd, 0x99, 0x55, 0x11, - 0xca, 0x8e, 0x42, 0x06, 0xc7, 0x83, 0x4f, 0x0b, 0xe4, 0xa0, - 0x6c, 0x28, 0xe9, 0xad, 0x61, 0x25, 0xfe, 0xba, 0x76, 0x32, - 0xf3, 0xb7, 0x7b, 0x3f, 0xb8, 0xfc, 0x30, 0x74, 0xb5, 0xf1, - 0x3d, 0x79, 0xa2, 0xe6, 0x2a, 0x6e, 0xaf, 0xeb, 0x27, 0x63, - 0x8c, 0xc8, 0x04, 0x40, 0x81, 0xc5, 0x09, 0x4d, 0x96, 0xd2, - 0x1e, 0x5a, 0x9b, 0xdf, 0x13, 0x57, 0xbd, 0xf9, 0x35, 0x71, - 0xb0, 0xf4, 0x38, 0x7c, 0xa7, 0xe3, 0x2f, 0x6b, 0xaa, 0xee, - 0x22, 0x66, 0x89, 0xcd, 0x01, 0x45, 0x84, 0xc0, 0x0c, 0x48, - 0x93, 0xd7, 0x1b, 0x5f, 0x9e, 0xda, 0x16, 0x52, 0xd5, 0x91, - 0x5d, 0x19, 0xd8, 0x9c, 0x50, 0x14, 0xcf, 0x8b, 0x47, 0x03, - 0xc2, 0x86, 0x4a, 0x0e, 0xe1, 0xa5, 0x69, 0x2d, 0xec, 0xa8, - 0x64, 0x20, 0xfb, 0xbf, 0x73, 0x37, 0xf6, 0xb2, 0x7e, 0x3a, - 0x6d, 0x29, 0xe5, 0xa1, 0x60, 0x24, 0xe8, 0xac, 0x77, 0x33, - 0xff, 0xbb, 0x7a, 0x3e, 0xf2, 0xb6, 0x59, 0x1d, 0xd1, 0x95, - 0x54, 0x10, 0xdc, 0x98, 0x43, 0x07, 0xcb, 0x8f, 0x4e, 0x0a, - 0xc6, 0x82, 0x05, 0x41, 0x8d, 0xc9, 0x08, 0x4c, 0x80, 0xc4, - 0x1f, 0x5b, 0x97, 0xd3, 0x12, 0x56, 0x9a, 0xde, 0x31, 0x75, - 0xb9, 0xfd, 0x3c, 0x78, 0xb4, 0xf0, 0x2b, 0x6f, 0xa3, 0xe7, - 0x26, 0x62, 0xae, 0xea, 0x00, 0x45, 0x8a, 0xcf, 0x09, 0x4c, - 0x83, 0xc6, 0x12, 0x57, 0x98, 0xdd, 0x1b, 0x5e, 0x91, 0xd4, - 0x24, 0x61, 0xae, 0xeb, 0x2d, 0x68, 0xa7, 0xe2, 0x36, 0x73, - 0xbc, 0xf9, 0x3f, 0x7a, 0xb5, 0xf0, 0x48, 0x0d, 0xc2, 0x87, - 0x41, 0x04, 0xcb, 0x8e, 0x5a, 0x1f, 0xd0, 0x95, 0x53, 0x16, - 0xd9, 0x9c, 0x6c, 0x29, 0xe6, 0xa3, 0x65, 0x20, 0xef, 0xaa, - 0x7e, 0x3b, 0xf4, 0xb1, 0x77, 0x32, 0xfd, 0xb8, 0x90, 0xd5, - 0x1a, 0x5f, 0x99, 0xdc, 0x13, 0x56, 0x82, 0xc7, 0x08, 0x4d, - 0x8b, 0xce, 0x01, 0x44, 0xb4, 0xf1, 0x3e, 0x7b, 0xbd, 0xf8, - 0x37, 0x72, 0xa6, 0xe3, 0x2c, 0x69, 0xaf, 0xea, 0x25, 0x60, - 0xd8, 0x9d, 0x52, 0x17, 0xd1, 0x94, 0x5b, 0x1e, 0xca, 0x8f, - 0x40, 0x05, 0xc3, 0x86, 0x49, 0x0c, 0xfc, 0xb9, 0x76, 0x33, - 0xf5, 0xb0, 0x7f, 0x3a, 0xee, 0xab, 0x64, 0x21, 0xe7, 0xa2, - 0x6d, 0x28, 0x3d, 0x78, 0xb7, 0xf2, 0x34, 0x71, 0xbe, 0xfb, - 0x2f, 0x6a, 0xa5, 0xe0, 0x26, 0x63, 0xac, 0xe9, 0x19, 0x5c, - 0x93, 0xd6, 0x10, 0x55, 0x9a, 0xdf, 0x0b, 0x4e, 0x81, 0xc4, - 0x02, 0x47, 0x88, 0xcd, 0x75, 0x30, 0xff, 0xba, 0x7c, 0x39, - 0xf6, 0xb3, 0x67, 0x22, 0xed, 0xa8, 0x6e, 0x2b, 0xe4, 0xa1, - 0x51, 0x14, 0xdb, 0x9e, 0x58, 0x1d, 0xd2, 0x97, 0x43, 0x06, - 0xc9, 0x8c, 0x4a, 0x0f, 0xc0, 0x85, 0xad, 0xe8, 0x27, 0x62, - 0xa4, 0xe1, 0x2e, 0x6b, 0xbf, 0xfa, 0x35, 0x70, 0xb6, 0xf3, - 0x3c, 0x79, 0x89, 0xcc, 0x03, 0x46, 0x80, 0xc5, 0x0a, 0x4f, - 0x9b, 0xde, 0x11, 0x54, 0x92, 0xd7, 0x18, 0x5d, 0xe5, 0xa0, - 0x6f, 0x2a, 0xec, 0xa9, 0x66, 0x23, 0xf7, 0xb2, 0x7d, 0x38, - 0xfe, 0xbb, 0x74, 0x31, 0xc1, 0x84, 0x4b, 0x0e, 0xc8, 0x8d, - 0x42, 0x07, 0xd3, 0x96, 0x59, 0x1c, 0xda, 0x9f, 0x50, 0x15, - 0x00, 0x46, 0x8c, 0xca, 0x05, 0x43, 0x89, 0xcf, 0x0a, 0x4c, - 0x86, 0xc0, 0x0f, 0x49, 0x83, 0xc5, 0x14, 0x52, 0x98, 0xde, - 0x11, 0x57, 0x9d, 0xdb, 0x1e, 0x58, 0x92, 0xd4, 0x1b, 0x5d, - 0x97, 0xd1, 0x28, 0x6e, 0xa4, 0xe2, 0x2d, 0x6b, 0xa1, 0xe7, - 0x22, 0x64, 0xae, 0xe8, 0x27, 0x61, 0xab, 0xed, 0x3c, 0x7a, - 0xb0, 0xf6, 0x39, 0x7f, 0xb5, 0xf3, 0x36, 0x70, 0xba, 0xfc, - 0x33, 0x75, 0xbf, 0xf9, 0x50, 0x16, 0xdc, 0x9a, 0x55, 0x13, - 0xd9, 0x9f, 0x5a, 0x1c, 0xd6, 0x90, 0x5f, 0x19, 0xd3, 0x95, - 0x44, 0x02, 0xc8, 0x8e, 0x41, 0x07, 0xcd, 0x8b, 0x4e, 0x08, - 0xc2, 0x84, 0x4b, 0x0d, 0xc7, 0x81, 0x78, 0x3e, 0xf4, 0xb2, - 0x7d, 0x3b, 0xf1, 0xb7, 0x72, 0x34, 0xfe, 0xb8, 0x77, 0x31, - 0xfb, 0xbd, 0x6c, 0x2a, 0xe0, 0xa6, 0x69, 0x2f, 0xe5, 0xa3, - 0x66, 0x20, 0xea, 0xac, 0x63, 0x25, 0xef, 0xa9, 0xa0, 0xe6, - 0x2c, 0x6a, 0xa5, 0xe3, 0x29, 0x6f, 0xaa, 0xec, 0x26, 0x60, - 0xaf, 0xe9, 0x23, 0x65, 0xb4, 0xf2, 0x38, 0x7e, 0xb1, 0xf7, - 0x3d, 0x7b, 0xbe, 0xf8, 0x32, 0x74, 0xbb, 0xfd, 0x37, 0x71, - 0x88, 0xce, 0x04, 0x42, 0x8d, 0xcb, 0x01, 0x47, 0x82, 0xc4, - 0x0e, 0x48, 0x87, 0xc1, 0x0b, 0x4d, 0x9c, 0xda, 0x10, 0x56, - 0x99, 0xdf, 0x15, 0x53, 0x96, 0xd0, 0x1a, 0x5c, 0x93, 0xd5, - 0x1f, 0x59, 0xf0, 0xb6, 0x7c, 0x3a, 0xf5, 0xb3, 0x79, 0x3f, - 0xfa, 0xbc, 0x76, 0x30, 0xff, 0xb9, 0x73, 0x35, 0xe4, 0xa2, - 0x68, 0x2e, 0xe1, 0xa7, 0x6d, 0x2b, 0xee, 0xa8, 0x62, 0x24, - 0xeb, 0xad, 0x67, 0x21, 0xd8, 0x9e, 0x54, 0x12, 0xdd, 0x9b, - 0x51, 0x17, 0xd2, 0x94, 0x5e, 0x18, 0xd7, 0x91, 0x5b, 0x1d, - 0xcc, 0x8a, 0x40, 0x06, 0xc9, 0x8f, 0x45, 0x03, 0xc6, 0x80, - 0x4a, 0x0c, 0xc3, 0x85, 0x4f, 0x09, 0x00, 0x47, 0x8e, 0xc9, - 0x01, 0x46, 0x8f, 0xc8, 0x02, 0x45, 0x8c, 0xcb, 0x03, 0x44, - 0x8d, 0xca, 0x04, 0x43, 0x8a, 0xcd, 0x05, 0x42, 0x8b, 0xcc, - 0x06, 0x41, 0x88, 0xcf, 0x07, 0x40, 0x89, 0xce, 0x08, 0x4f, - 0x86, 0xc1, 0x09, 0x4e, 0x87, 0xc0, 0x0a, 0x4d, 0x84, 0xc3, - 0x0b, 0x4c, 0x85, 0xc2, 0x0c, 0x4b, 0x82, 0xc5, 0x0d, 0x4a, - 0x83, 0xc4, 0x0e, 0x49, 0x80, 0xc7, 0x0f, 0x48, 0x81, 0xc6, - 0x10, 0x57, 0x9e, 0xd9, 0x11, 0x56, 0x9f, 0xd8, 0x12, 0x55, - 0x9c, 0xdb, 0x13, 0x54, 0x9d, 0xda, 0x14, 0x53, 0x9a, 0xdd, - 0x15, 0x52, 0x9b, 0xdc, 0x16, 0x51, 0x98, 0xdf, 0x17, 0x50, - 0x99, 0xde, 0x18, 0x5f, 0x96, 0xd1, 0x19, 0x5e, 0x97, 0xd0, - 0x1a, 0x5d, 0x94, 0xd3, 0x1b, 0x5c, 0x95, 0xd2, 0x1c, 0x5b, - 0x92, 0xd5, 0x1d, 0x5a, 0x93, 0xd4, 0x1e, 0x59, 0x90, 0xd7, - 0x1f, 0x58, 0x91, 0xd6, 0x20, 0x67, 0xae, 0xe9, 0x21, 0x66, - 0xaf, 0xe8, 0x22, 0x65, 0xac, 0xeb, 0x23, 0x64, 0xad, 0xea, - 0x24, 0x63, 0xaa, 0xed, 0x25, 0x62, 0xab, 0xec, 0x26, 0x61, - 0xa8, 0xef, 0x27, 0x60, 0xa9, 0xee, 0x28, 0x6f, 0xa6, 0xe1, - 0x29, 0x6e, 0xa7, 0xe0, 0x2a, 0x6d, 0xa4, 0xe3, 0x2b, 0x6c, - 0xa5, 0xe2, 0x2c, 0x6b, 0xa2, 0xe5, 0x2d, 0x6a, 0xa3, 0xe4, - 0x2e, 0x69, 0xa0, 0xe7, 0x2f, 0x68, 0xa1, 0xe6, 0x30, 0x77, - 0xbe, 0xf9, 0x31, 0x76, 0xbf, 0xf8, 0x32, 0x75, 0xbc, 0xfb, - 0x33, 0x74, 0xbd, 0xfa, 0x34, 0x73, 0xba, 0xfd, 0x35, 0x72, - 0xbb, 0xfc, 0x36, 0x71, 0xb8, 0xff, 0x37, 0x70, 0xb9, 0xfe, - 0x38, 0x7f, 0xb6, 0xf1, 0x39, 0x7e, 0xb7, 0xf0, 0x3a, 0x7d, - 0xb4, 0xf3, 0x3b, 0x7c, 0xb5, 0xf2, 0x3c, 0x7b, 0xb2, 0xf5, - 0x3d, 0x7a, 0xb3, 0xf4, 0x3e, 0x79, 0xb0, 0xf7, 0x3f, 0x78, - 0xb1, 0xf6, 0x00, 0x48, 0x90, 0xd8, 0x3d, 0x75, 0xad, 0xe5, - 0x7a, 0x32, 0xea, 0xa2, 0x47, 0x0f, 0xd7, 0x9f, 0xf4, 0xbc, - 0x64, 0x2c, 0xc9, 0x81, 0x59, 0x11, 0x8e, 0xc6, 0x1e, 0x56, - 0xb3, 0xfb, 0x23, 0x6b, 0xf5, 0xbd, 0x65, 0x2d, 0xc8, 0x80, - 0x58, 0x10, 0x8f, 0xc7, 0x1f, 0x57, 0xb2, 0xfa, 0x22, 0x6a, - 0x01, 0x49, 0x91, 0xd9, 0x3c, 0x74, 0xac, 0xe4, 0x7b, 0x33, - 0xeb, 0xa3, 0x46, 0x0e, 0xd6, 0x9e, 0xf7, 0xbf, 0x67, 0x2f, - 0xca, 0x82, 0x5a, 0x12, 0x8d, 0xc5, 0x1d, 0x55, 0xb0, 0xf8, - 0x20, 0x68, 0x03, 0x4b, 0x93, 0xdb, 0x3e, 0x76, 0xae, 0xe6, - 0x79, 0x31, 0xe9, 0xa1, 0x44, 0x0c, 0xd4, 0x9c, 0x02, 0x4a, - 0x92, 0xda, 0x3f, 0x77, 0xaf, 0xe7, 0x78, 0x30, 0xe8, 0xa0, - 0x45, 0x0d, 0xd5, 0x9d, 0xf6, 0xbe, 0x66, 0x2e, 0xcb, 0x83, - 0x5b, 0x13, 0x8c, 0xc4, 0x1c, 0x54, 0xb1, 0xf9, 0x21, 0x69, - 0xf3, 0xbb, 0x63, 0x2b, 0xce, 0x86, 0x5e, 0x16, 0x89, 0xc1, - 0x19, 0x51, 0xb4, 0xfc, 0x24, 0x6c, 0x07, 0x4f, 0x97, 0xdf, - 0x3a, 0x72, 0xaa, 0xe2, 0x7d, 0x35, 0xed, 0xa5, 0x40, 0x08, - 0xd0, 0x98, 0x06, 0x4e, 0x96, 0xde, 0x3b, 0x73, 0xab, 0xe3, - 0x7c, 0x34, 0xec, 0xa4, 0x41, 0x09, 0xd1, 0x99, 0xf2, 0xba, - 0x62, 0x2a, 0xcf, 0x87, 0x5f, 0x17, 0x88, 0xc0, 0x18, 0x50, - 0xb5, 0xfd, 0x25, 0x6d, 0x04, 0x4c, 0x94, 0xdc, 0x39, 0x71, - 0xa9, 0xe1, 0x7e, 0x36, 0xee, 0xa6, 0x43, 0x0b, 0xd3, 0x9b, - 0xf0, 0xb8, 0x60, 0x28, 0xcd, 0x85, 0x5d, 0x15, 0x8a, 0xc2, - 0x1a, 0x52, 0xb7, 0xff, 0x27, 0x6f, 0xf1, 0xb9, 0x61, 0x29, - 0xcc, 0x84, 0x5c, 0x14, 0x8b, 0xc3, 0x1b, 0x53, 0xb6, 0xfe, - 0x26, 0x6e, 0x05, 0x4d, 0x95, 0xdd, 0x38, 0x70, 0xa8, 0xe0, - 0x7f, 0x37, 0xef, 0xa7, 0x42, 0x0a, 0xd2, 0x9a, 0x00, 0x49, - 0x92, 0xdb, 0x39, 0x70, 0xab, 0xe2, 0x72, 0x3b, 0xe0, 0xa9, - 0x4b, 0x02, 0xd9, 0x90, 0xe4, 0xad, 0x76, 0x3f, 0xdd, 0x94, - 0x4f, 0x06, 0x96, 0xdf, 0x04, 0x4d, 0xaf, 0xe6, 0x3d, 0x74, - 0xd5, 0x9c, 0x47, 0x0e, 0xec, 0xa5, 0x7e, 0x37, 0xa7, 0xee, - 0x35, 0x7c, 0x9e, 0xd7, 0x0c, 0x45, 0x31, 0x78, 0xa3, 0xea, - 0x08, 0x41, 0x9a, 0xd3, 0x43, 0x0a, 0xd1, 0x98, 0x7a, 0x33, - 0xe8, 0xa1, 0xb7, 0xfe, 0x25, 0x6c, 0x8e, 0xc7, 0x1c, 0x55, - 0xc5, 0x8c, 0x57, 0x1e, 0xfc, 0xb5, 0x6e, 0x27, 0x53, 0x1a, - 0xc1, 0x88, 0x6a, 0x23, 0xf8, 0xb1, 0x21, 0x68, 0xb3, 0xfa, - 0x18, 0x51, 0x8a, 0xc3, 0x62, 0x2b, 0xf0, 0xb9, 0x5b, 0x12, - 0xc9, 0x80, 0x10, 0x59, 0x82, 0xcb, 0x29, 0x60, 0xbb, 0xf2, - 0x86, 0xcf, 0x14, 0x5d, 0xbf, 0xf6, 0x2d, 0x64, 0xf4, 0xbd, - 0x66, 0x2f, 0xcd, 0x84, 0x5f, 0x16, 0x73, 0x3a, 0xe1, 0xa8, - 0x4a, 0x03, 0xd8, 0x91, 0x01, 0x48, 0x93, 0xda, 0x38, 0x71, - 0xaa, 0xe3, 0x97, 0xde, 0x05, 0x4c, 0xae, 0xe7, 0x3c, 0x75, - 0xe5, 0xac, 0x77, 0x3e, 0xdc, 0x95, 0x4e, 0x07, 0xa6, 0xef, - 0x34, 0x7d, 0x9f, 0xd6, 0x0d, 0x44, 0xd4, 0x9d, 0x46, 0x0f, - 0xed, 0xa4, 0x7f, 0x36, 0x42, 0x0b, 0xd0, 0x99, 0x7b, 0x32, - 0xe9, 0xa0, 0x30, 0x79, 0xa2, 0xeb, 0x09, 0x40, 0x9b, 0xd2, - 0xc4, 0x8d, 0x56, 0x1f, 0xfd, 0xb4, 0x6f, 0x26, 0xb6, 0xff, - 0x24, 0x6d, 0x8f, 0xc6, 0x1d, 0x54, 0x20, 0x69, 0xb2, 0xfb, - 0x19, 0x50, 0x8b, 0xc2, 0x52, 0x1b, 0xc0, 0x89, 0x6b, 0x22, - 0xf9, 0xb0, 0x11, 0x58, 0x83, 0xca, 0x28, 0x61, 0xba, 0xf3, - 0x63, 0x2a, 0xf1, 0xb8, 0x5a, 0x13, 0xc8, 0x81, 0xf5, 0xbc, - 0x67, 0x2e, 0xcc, 0x85, 0x5e, 0x17, 0x87, 0xce, 0x15, 0x5c, - 0xbe, 0xf7, 0x2c, 0x65, 0x00, 0x4a, 0x94, 0xde, 0x35, 0x7f, - 0xa1, 0xeb, 0x6a, 0x20, 0xfe, 0xb4, 0x5f, 0x15, 0xcb, 0x81, - 0xd4, 0x9e, 0x40, 0x0a, 0xe1, 0xab, 0x75, 0x3f, 0xbe, 0xf4, - 0x2a, 0x60, 0x8b, 0xc1, 0x1f, 0x55, 0xb5, 0xff, 0x21, 0x6b, - 0x80, 0xca, 0x14, 0x5e, 0xdf, 0x95, 0x4b, 0x01, 0xea, 0xa0, - 0x7e, 0x34, 0x61, 0x2b, 0xf5, 0xbf, 0x54, 0x1e, 0xc0, 0x8a, - 0x0b, 0x41, 0x9f, 0xd5, 0x3e, 0x74, 0xaa, 0xe0, 0x77, 0x3d, - 0xe3, 0xa9, 0x42, 0x08, 0xd6, 0x9c, 0x1d, 0x57, 0x89, 0xc3, - 0x28, 0x62, 0xbc, 0xf6, 0xa3, 0xe9, 0x37, 0x7d, 0x96, 0xdc, - 0x02, 0x48, 0xc9, 0x83, 0x5d, 0x17, 0xfc, 0xb6, 0x68, 0x22, - 0xc2, 0x88, 0x56, 0x1c, 0xf7, 0xbd, 0x63, 0x29, 0xa8, 0xe2, - 0x3c, 0x76, 0x9d, 0xd7, 0x09, 0x43, 0x16, 0x5c, 0x82, 0xc8, - 0x23, 0x69, 0xb7, 0xfd, 0x7c, 0x36, 0xe8, 0xa2, 0x49, 0x03, - 0xdd, 0x97, 0xee, 0xa4, 0x7a, 0x30, 0xdb, 0x91, 0x4f, 0x05, - 0x84, 0xce, 0x10, 0x5a, 0xb1, 0xfb, 0x25, 0x6f, 0x3a, 0x70, - 0xae, 0xe4, 0x0f, 0x45, 0x9b, 0xd1, 0x50, 0x1a, 0xc4, 0x8e, - 0x65, 0x2f, 0xf1, 0xbb, 0x5b, 0x11, 0xcf, 0x85, 0x6e, 0x24, - 0xfa, 0xb0, 0x31, 0x7b, 0xa5, 0xef, 0x04, 0x4e, 0x90, 0xda, - 0x8f, 0xc5, 0x1b, 0x51, 0xba, 0xf0, 0x2e, 0x64, 0xe5, 0xaf, - 0x71, 0x3b, 0xd0, 0x9a, 0x44, 0x0e, 0x99, 0xd3, 0x0d, 0x47, - 0xac, 0xe6, 0x38, 0x72, 0xf3, 0xb9, 0x67, 0x2d, 0xc6, 0x8c, - 0x52, 0x18, 0x4d, 0x07, 0xd9, 0x93, 0x78, 0x32, 0xec, 0xa6, - 0x27, 0x6d, 0xb3, 0xf9, 0x12, 0x58, 0x86, 0xcc, 0x2c, 0x66, - 0xb8, 0xf2, 0x19, 0x53, 0x8d, 0xc7, 0x46, 0x0c, 0xd2, 0x98, - 0x73, 0x39, 0xe7, 0xad, 0xf8, 0xb2, 0x6c, 0x26, 0xcd, 0x87, - 0x59, 0x13, 0x92, 0xd8, 0x06, 0x4c, 0xa7, 0xed, 0x33, 0x79, - 0x00, 0x4b, 0x96, 0xdd, 0x31, 0x7a, 0xa7, 0xec, 0x62, 0x29, - 0xf4, 0xbf, 0x53, 0x18, 0xc5, 0x8e, 0xc4, 0x8f, 0x52, 0x19, - 0xf5, 0xbe, 0x63, 0x28, 0xa6, 0xed, 0x30, 0x7b, 0x97, 0xdc, - 0x01, 0x4a, 0x95, 0xde, 0x03, 0x48, 0xa4, 0xef, 0x32, 0x79, - 0xf7, 0xbc, 0x61, 0x2a, 0xc6, 0x8d, 0x50, 0x1b, 0x51, 0x1a, - 0xc7, 0x8c, 0x60, 0x2b, 0xf6, 0xbd, 0x33, 0x78, 0xa5, 0xee, - 0x02, 0x49, 0x94, 0xdf, 0x37, 0x7c, 0xa1, 0xea, 0x06, 0x4d, - 0x90, 0xdb, 0x55, 0x1e, 0xc3, 0x88, 0x64, 0x2f, 0xf2, 0xb9, - 0xf3, 0xb8, 0x65, 0x2e, 0xc2, 0x89, 0x54, 0x1f, 0x91, 0xda, - 0x07, 0x4c, 0xa0, 0xeb, 0x36, 0x7d, 0xa2, 0xe9, 0x34, 0x7f, - 0x93, 0xd8, 0x05, 0x4e, 0xc0, 0x8b, 0x56, 0x1d, 0xf1, 0xba, - 0x67, 0x2c, 0x66, 0x2d, 0xf0, 0xbb, 0x57, 0x1c, 0xc1, 0x8a, - 0x04, 0x4f, 0x92, 0xd9, 0x35, 0x7e, 0xa3, 0xe8, 0x6e, 0x25, - 0xf8, 0xb3, 0x5f, 0x14, 0xc9, 0x82, 0x0c, 0x47, 0x9a, 0xd1, - 0x3d, 0x76, 0xab, 0xe0, 0xaa, 0xe1, 0x3c, 0x77, 0x9b, 0xd0, - 0x0d, 0x46, 0xc8, 0x83, 0x5e, 0x15, 0xf9, 0xb2, 0x6f, 0x24, - 0xfb, 0xb0, 0x6d, 0x26, 0xca, 0x81, 0x5c, 0x17, 0x99, 0xd2, - 0x0f, 0x44, 0xa8, 0xe3, 0x3e, 0x75, 0x3f, 0x74, 0xa9, 0xe2, - 0x0e, 0x45, 0x98, 0xd3, 0x5d, 0x16, 0xcb, 0x80, 0x6c, 0x27, - 0xfa, 0xb1, 0x59, 0x12, 0xcf, 0x84, 0x68, 0x23, 0xfe, 0xb5, - 0x3b, 0x70, 0xad, 0xe6, 0x0a, 0x41, 0x9c, 0xd7, 0x9d, 0xd6, - 0x0b, 0x40, 0xac, 0xe7, 0x3a, 0x71, 0xff, 0xb4, 0x69, 0x22, - 0xce, 0x85, 0x58, 0x13, 0xcc, 0x87, 0x5a, 0x11, 0xfd, 0xb6, - 0x6b, 0x20, 0xae, 0xe5, 0x38, 0x73, 0x9f, 0xd4, 0x09, 0x42, - 0x08, 0x43, 0x9e, 0xd5, 0x39, 0x72, 0xaf, 0xe4, 0x6a, 0x21, - 0xfc, 0xb7, 0x5b, 0x10, 0xcd, 0x86, 0x00, 0x4c, 0x98, 0xd4, - 0x2d, 0x61, 0xb5, 0xf9, 0x5a, 0x16, 0xc2, 0x8e, 0x77, 0x3b, - 0xef, 0xa3, 0xb4, 0xf8, 0x2c, 0x60, 0x99, 0xd5, 0x01, 0x4d, - 0xee, 0xa2, 0x76, 0x3a, 0xc3, 0x8f, 0x5b, 0x17, 0x75, 0x39, - 0xed, 0xa1, 0x58, 0x14, 0xc0, 0x8c, 0x2f, 0x63, 0xb7, 0xfb, - 0x02, 0x4e, 0x9a, 0xd6, 0xc1, 0x8d, 0x59, 0x15, 0xec, 0xa0, - 0x74, 0x38, 0x9b, 0xd7, 0x03, 0x4f, 0xb6, 0xfa, 0x2e, 0x62, - 0xea, 0xa6, 0x72, 0x3e, 0xc7, 0x8b, 0x5f, 0x13, 0xb0, 0xfc, - 0x28, 0x64, 0x9d, 0xd1, 0x05, 0x49, 0x5e, 0x12, 0xc6, 0x8a, - 0x73, 0x3f, 0xeb, 0xa7, 0x04, 0x48, 0x9c, 0xd0, 0x29, 0x65, - 0xb1, 0xfd, 0x9f, 0xd3, 0x07, 0x4b, 0xb2, 0xfe, 0x2a, 0x66, - 0xc5, 0x89, 0x5d, 0x11, 0xe8, 0xa4, 0x70, 0x3c, 0x2b, 0x67, - 0xb3, 0xff, 0x06, 0x4a, 0x9e, 0xd2, 0x71, 0x3d, 0xe9, 0xa5, - 0x5c, 0x10, 0xc4, 0x88, 0xc9, 0x85, 0x51, 0x1d, 0xe4, 0xa8, - 0x7c, 0x30, 0x93, 0xdf, 0x0b, 0x47, 0xbe, 0xf2, 0x26, 0x6a, - 0x7d, 0x31, 0xe5, 0xa9, 0x50, 0x1c, 0xc8, 0x84, 0x27, 0x6b, - 0xbf, 0xf3, 0x0a, 0x46, 0x92, 0xde, 0xbc, 0xf0, 0x24, 0x68, - 0x91, 0xdd, 0x09, 0x45, 0xe6, 0xaa, 0x7e, 0x32, 0xcb, 0x87, - 0x53, 0x1f, 0x08, 0x44, 0x90, 0xdc, 0x25, 0x69, 0xbd, 0xf1, - 0x52, 0x1e, 0xca, 0x86, 0x7f, 0x33, 0xe7, 0xab, 0x23, 0x6f, - 0xbb, 0xf7, 0x0e, 0x42, 0x96, 0xda, 0x79, 0x35, 0xe1, 0xad, - 0x54, 0x18, 0xcc, 0x80, 0x97, 0xdb, 0x0f, 0x43, 0xba, 0xf6, - 0x22, 0x6e, 0xcd, 0x81, 0x55, 0x19, 0xe0, 0xac, 0x78, 0x34, - 0x56, 0x1a, 0xce, 0x82, 0x7b, 0x37, 0xe3, 0xaf, 0x0c, 0x40, - 0x94, 0xd8, 0x21, 0x6d, 0xb9, 0xf5, 0xe2, 0xae, 0x7a, 0x36, - 0xcf, 0x83, 0x57, 0x1b, 0xb8, 0xf4, 0x20, 0x6c, 0x95, 0xd9, - 0x0d, 0x41, 0x00, 0x4d, 0x9a, 0xd7, 0x29, 0x64, 0xb3, 0xfe, - 0x52, 0x1f, 0xc8, 0x85, 0x7b, 0x36, 0xe1, 0xac, 0xa4, 0xe9, - 0x3e, 0x73, 0x8d, 0xc0, 0x17, 0x5a, 0xf6, 0xbb, 0x6c, 0x21, - 0xdf, 0x92, 0x45, 0x08, 0x55, 0x18, 0xcf, 0x82, 0x7c, 0x31, - 0xe6, 0xab, 0x07, 0x4a, 0x9d, 0xd0, 0x2e, 0x63, 0xb4, 0xf9, - 0xf1, 0xbc, 0x6b, 0x26, 0xd8, 0x95, 0x42, 0x0f, 0xa3, 0xee, - 0x39, 0x74, 0x8a, 0xc7, 0x10, 0x5d, 0xaa, 0xe7, 0x30, 0x7d, - 0x83, 0xce, 0x19, 0x54, 0xf8, 0xb5, 0x62, 0x2f, 0xd1, 0x9c, - 0x4b, 0x06, 0x0e, 0x43, 0x94, 0xd9, 0x27, 0x6a, 0xbd, 0xf0, - 0x5c, 0x11, 0xc6, 0x8b, 0x75, 0x38, 0xef, 0xa2, 0xff, 0xb2, - 0x65, 0x28, 0xd6, 0x9b, 0x4c, 0x01, 0xad, 0xe0, 0x37, 0x7a, - 0x84, 0xc9, 0x1e, 0x53, 0x5b, 0x16, 0xc1, 0x8c, 0x72, 0x3f, - 0xe8, 0xa5, 0x09, 0x44, 0x93, 0xde, 0x20, 0x6d, 0xba, 0xf7, - 0x49, 0x04, 0xd3, 0x9e, 0x60, 0x2d, 0xfa, 0xb7, 0x1b, 0x56, - 0x81, 0xcc, 0x32, 0x7f, 0xa8, 0xe5, 0xed, 0xa0, 0x77, 0x3a, - 0xc4, 0x89, 0x5e, 0x13, 0xbf, 0xf2, 0x25, 0x68, 0x96, 0xdb, - 0x0c, 0x41, 0x1c, 0x51, 0x86, 0xcb, 0x35, 0x78, 0xaf, 0xe2, - 0x4e, 0x03, 0xd4, 0x99, 0x67, 0x2a, 0xfd, 0xb0, 0xb8, 0xf5, - 0x22, 0x6f, 0x91, 0xdc, 0x0b, 0x46, 0xea, 0xa7, 0x70, 0x3d, - 0xc3, 0x8e, 0x59, 0x14, 0xe3, 0xae, 0x79, 0x34, 0xca, 0x87, - 0x50, 0x1d, 0xb1, 0xfc, 0x2b, 0x66, 0x98, 0xd5, 0x02, 0x4f, - 0x47, 0x0a, 0xdd, 0x90, 0x6e, 0x23, 0xf4, 0xb9, 0x15, 0x58, - 0x8f, 0xc2, 0x3c, 0x71, 0xa6, 0xeb, 0xb6, 0xfb, 0x2c, 0x61, - 0x9f, 0xd2, 0x05, 0x48, 0xe4, 0xa9, 0x7e, 0x33, 0xcd, 0x80, - 0x57, 0x1a, 0x12, 0x5f, 0x88, 0xc5, 0x3b, 0x76, 0xa1, 0xec, - 0x40, 0x0d, 0xda, 0x97, 0x69, 0x24, 0xf3, 0xbe, 0x00, 0x4e, - 0x9c, 0xd2, 0x25, 0x6b, 0xb9, 0xf7, 0x4a, 0x04, 0xd6, 0x98, - 0x6f, 0x21, 0xf3, 0xbd, 0x94, 0xda, 0x08, 0x46, 0xb1, 0xff, - 0x2d, 0x63, 0xde, 0x90, 0x42, 0x0c, 0xfb, 0xb5, 0x67, 0x29, - 0x35, 0x7b, 0xa9, 0xe7, 0x10, 0x5e, 0x8c, 0xc2, 0x7f, 0x31, - 0xe3, 0xad, 0x5a, 0x14, 0xc6, 0x88, 0xa1, 0xef, 0x3d, 0x73, - 0x84, 0xca, 0x18, 0x56, 0xeb, 0xa5, 0x77, 0x39, 0xce, 0x80, - 0x52, 0x1c, 0x6a, 0x24, 0xf6, 0xb8, 0x4f, 0x01, 0xd3, 0x9d, - 0x20, 0x6e, 0xbc, 0xf2, 0x05, 0x4b, 0x99, 0xd7, 0xfe, 0xb0, - 0x62, 0x2c, 0xdb, 0x95, 0x47, 0x09, 0xb4, 0xfa, 0x28, 0x66, - 0x91, 0xdf, 0x0d, 0x43, 0x5f, 0x11, 0xc3, 0x8d, 0x7a, 0x34, - 0xe6, 0xa8, 0x15, 0x5b, 0x89, 0xc7, 0x30, 0x7e, 0xac, 0xe2, - 0xcb, 0x85, 0x57, 0x19, 0xee, 0xa0, 0x72, 0x3c, 0x81, 0xcf, - 0x1d, 0x53, 0xa4, 0xea, 0x38, 0x76, 0xd4, 0x9a, 0x48, 0x06, - 0xf1, 0xbf, 0x6d, 0x23, 0x9e, 0xd0, 0x02, 0x4c, 0xbb, 0xf5, - 0x27, 0x69, 0x40, 0x0e, 0xdc, 0x92, 0x65, 0x2b, 0xf9, 0xb7, - 0x0a, 0x44, 0x96, 0xd8, 0x2f, 0x61, 0xb3, 0xfd, 0xe1, 0xaf, - 0x7d, 0x33, 0xc4, 0x8a, 0x58, 0x16, 0xab, 0xe5, 0x37, 0x79, - 0x8e, 0xc0, 0x12, 0x5c, 0x75, 0x3b, 0xe9, 0xa7, 0x50, 0x1e, - 0xcc, 0x82, 0x3f, 0x71, 0xa3, 0xed, 0x1a, 0x54, 0x86, 0xc8, - 0xbe, 0xf0, 0x22, 0x6c, 0x9b, 0xd5, 0x07, 0x49, 0xf4, 0xba, - 0x68, 0x26, 0xd1, 0x9f, 0x4d, 0x03, 0x2a, 0x64, 0xb6, 0xf8, - 0x0f, 0x41, 0x93, 0xdd, 0x60, 0x2e, 0xfc, 0xb2, 0x45, 0x0b, - 0xd9, 0x97, 0x8b, 0xc5, 0x17, 0x59, 0xae, 0xe0, 0x32, 0x7c, - 0xc1, 0x8f, 0x5d, 0x13, 0xe4, 0xaa, 0x78, 0x36, 0x1f, 0x51, - 0x83, 0xcd, 0x3a, 0x74, 0xa6, 0xe8, 0x55, 0x1b, 0xc9, 0x87, - 0x70, 0x3e, 0xec, 0xa2, 0x00, 0x4f, 0x9e, 0xd1, 0x21, 0x6e, - 0xbf, 0xf0, 0x42, 0x0d, 0xdc, 0x93, 0x63, 0x2c, 0xfd, 0xb2, - 0x84, 0xcb, 0x1a, 0x55, 0xa5, 0xea, 0x3b, 0x74, 0xc6, 0x89, - 0x58, 0x17, 0xe7, 0xa8, 0x79, 0x36, 0x15, 0x5a, 0x8b, 0xc4, - 0x34, 0x7b, 0xaa, 0xe5, 0x57, 0x18, 0xc9, 0x86, 0x76, 0x39, - 0xe8, 0xa7, 0x91, 0xde, 0x0f, 0x40, 0xb0, 0xff, 0x2e, 0x61, - 0xd3, 0x9c, 0x4d, 0x02, 0xf2, 0xbd, 0x6c, 0x23, 0x2a, 0x65, - 0xb4, 0xfb, 0x0b, 0x44, 0x95, 0xda, 0x68, 0x27, 0xf6, 0xb9, - 0x49, 0x06, 0xd7, 0x98, 0xae, 0xe1, 0x30, 0x7f, 0x8f, 0xc0, - 0x11, 0x5e, 0xec, 0xa3, 0x72, 0x3d, 0xcd, 0x82, 0x53, 0x1c, - 0x3f, 0x70, 0xa1, 0xee, 0x1e, 0x51, 0x80, 0xcf, 0x7d, 0x32, - 0xe3, 0xac, 0x5c, 0x13, 0xc2, 0x8d, 0xbb, 0xf4, 0x25, 0x6a, - 0x9a, 0xd5, 0x04, 0x4b, 0xf9, 0xb6, 0x67, 0x28, 0xd8, 0x97, - 0x46, 0x09, 0x54, 0x1b, 0xca, 0x85, 0x75, 0x3a, 0xeb, 0xa4, - 0x16, 0x59, 0x88, 0xc7, 0x37, 0x78, 0xa9, 0xe6, 0xd0, 0x9f, - 0x4e, 0x01, 0xf1, 0xbe, 0x6f, 0x20, 0x92, 0xdd, 0x0c, 0x43, - 0xb3, 0xfc, 0x2d, 0x62, 0x41, 0x0e, 0xdf, 0x90, 0x60, 0x2f, - 0xfe, 0xb1, 0x03, 0x4c, 0x9d, 0xd2, 0x22, 0x6d, 0xbc, 0xf3, - 0xc5, 0x8a, 0x5b, 0x14, 0xe4, 0xab, 0x7a, 0x35, 0x87, 0xc8, - 0x19, 0x56, 0xa6, 0xe9, 0x38, 0x77, 0x7e, 0x31, 0xe0, 0xaf, - 0x5f, 0x10, 0xc1, 0x8e, 0x3c, 0x73, 0xa2, 0xed, 0x1d, 0x52, - 0x83, 0xcc, 0xfa, 0xb5, 0x64, 0x2b, 0xdb, 0x94, 0x45, 0x0a, - 0xb8, 0xf7, 0x26, 0x69, 0x99, 0xd6, 0x07, 0x48, 0x6b, 0x24, - 0xf5, 0xba, 0x4a, 0x05, 0xd4, 0x9b, 0x29, 0x66, 0xb7, 0xf8, - 0x08, 0x47, 0x96, 0xd9, 0xef, 0xa0, 0x71, 0x3e, 0xce, 0x81, - 0x50, 0x1f, 0xad, 0xe2, 0x33, 0x7c, 0x8c, 0xc3, 0x12, 0x5d, - 0x00, 0x50, 0xa0, 0xf0, 0x5d, 0x0d, 0xfd, 0xad, 0xba, 0xea, - 0x1a, 0x4a, 0xe7, 0xb7, 0x47, 0x17, 0x69, 0x39, 0xc9, 0x99, - 0x34, 0x64, 0x94, 0xc4, 0xd3, 0x83, 0x73, 0x23, 0x8e, 0xde, - 0x2e, 0x7e, 0xd2, 0x82, 0x72, 0x22, 0x8f, 0xdf, 0x2f, 0x7f, - 0x68, 0x38, 0xc8, 0x98, 0x35, 0x65, 0x95, 0xc5, 0xbb, 0xeb, - 0x1b, 0x4b, 0xe6, 0xb6, 0x46, 0x16, 0x01, 0x51, 0xa1, 0xf1, - 0x5c, 0x0c, 0xfc, 0xac, 0xb9, 0xe9, 0x19, 0x49, 0xe4, 0xb4, - 0x44, 0x14, 0x03, 0x53, 0xa3, 0xf3, 0x5e, 0x0e, 0xfe, 0xae, - 0xd0, 0x80, 0x70, 0x20, 0x8d, 0xdd, 0x2d, 0x7d, 0x6a, 0x3a, - 0xca, 0x9a, 0x37, 0x67, 0x97, 0xc7, 0x6b, 0x3b, 0xcb, 0x9b, - 0x36, 0x66, 0x96, 0xc6, 0xd1, 0x81, 0x71, 0x21, 0x8c, 0xdc, - 0x2c, 0x7c, 0x02, 0x52, 0xa2, 0xf2, 0x5f, 0x0f, 0xff, 0xaf, - 0xb8, 0xe8, 0x18, 0x48, 0xe5, 0xb5, 0x45, 0x15, 0x6f, 0x3f, - 0xcf, 0x9f, 0x32, 0x62, 0x92, 0xc2, 0xd5, 0x85, 0x75, 0x25, - 0x88, 0xd8, 0x28, 0x78, 0x06, 0x56, 0xa6, 0xf6, 0x5b, 0x0b, - 0xfb, 0xab, 0xbc, 0xec, 0x1c, 0x4c, 0xe1, 0xb1, 0x41, 0x11, - 0xbd, 0xed, 0x1d, 0x4d, 0xe0, 0xb0, 0x40, 0x10, 0x07, 0x57, - 0xa7, 0xf7, 0x5a, 0x0a, 0xfa, 0xaa, 0xd4, 0x84, 0x74, 0x24, - 0x89, 0xd9, 0x29, 0x79, 0x6e, 0x3e, 0xce, 0x9e, 0x33, 0x63, - 0x93, 0xc3, 0xd6, 0x86, 0x76, 0x26, 0x8b, 0xdb, 0x2b, 0x7b, - 0x6c, 0x3c, 0xcc, 0x9c, 0x31, 0x61, 0x91, 0xc1, 0xbf, 0xef, - 0x1f, 0x4f, 0xe2, 0xb2, 0x42, 0x12, 0x05, 0x55, 0xa5, 0xf5, - 0x58, 0x08, 0xf8, 0xa8, 0x04, 0x54, 0xa4, 0xf4, 0x59, 0x09, - 0xf9, 0xa9, 0xbe, 0xee, 0x1e, 0x4e, 0xe3, 0xb3, 0x43, 0x13, - 0x6d, 0x3d, 0xcd, 0x9d, 0x30, 0x60, 0x90, 0xc0, 0xd7, 0x87, - 0x77, 0x27, 0x8a, 0xda, 0x2a, 0x7a, 0x00, 0x51, 0xa2, 0xf3, - 0x59, 0x08, 0xfb, 0xaa, 0xb2, 0xe3, 0x10, 0x41, 0xeb, 0xba, - 0x49, 0x18, 0x79, 0x28, 0xdb, 0x8a, 0x20, 0x71, 0x82, 0xd3, - 0xcb, 0x9a, 0x69, 0x38, 0x92, 0xc3, 0x30, 0x61, 0xf2, 0xa3, - 0x50, 0x01, 0xab, 0xfa, 0x09, 0x58, 0x40, 0x11, 0xe2, 0xb3, - 0x19, 0x48, 0xbb, 0xea, 0x8b, 0xda, 0x29, 0x78, 0xd2, 0x83, - 0x70, 0x21, 0x39, 0x68, 0x9b, 0xca, 0x60, 0x31, 0xc2, 0x93, - 0xf9, 0xa8, 0x5b, 0x0a, 0xa0, 0xf1, 0x02, 0x53, 0x4b, 0x1a, - 0xe9, 0xb8, 0x12, 0x43, 0xb0, 0xe1, 0x80, 0xd1, 0x22, 0x73, - 0xd9, 0x88, 0x7b, 0x2a, 0x32, 0x63, 0x90, 0xc1, 0x6b, 0x3a, - 0xc9, 0x98, 0x0b, 0x5a, 0xa9, 0xf8, 0x52, 0x03, 0xf0, 0xa1, - 0xb9, 0xe8, 0x1b, 0x4a, 0xe0, 0xb1, 0x42, 0x13, 0x72, 0x23, - 0xd0, 0x81, 0x2b, 0x7a, 0x89, 0xd8, 0xc0, 0x91, 0x62, 0x33, - 0x99, 0xc8, 0x3b, 0x6a, 0xef, 0xbe, 0x4d, 0x1c, 0xb6, 0xe7, - 0x14, 0x45, 0x5d, 0x0c, 0xff, 0xae, 0x04, 0x55, 0xa6, 0xf7, - 0x96, 0xc7, 0x34, 0x65, 0xcf, 0x9e, 0x6d, 0x3c, 0x24, 0x75, - 0x86, 0xd7, 0x7d, 0x2c, 0xdf, 0x8e, 0x1d, 0x4c, 0xbf, 0xee, - 0x44, 0x15, 0xe6, 0xb7, 0xaf, 0xfe, 0x0d, 0x5c, 0xf6, 0xa7, - 0x54, 0x05, 0x64, 0x35, 0xc6, 0x97, 0x3d, 0x6c, 0x9f, 0xce, - 0xd6, 0x87, 0x74, 0x25, 0x8f, 0xde, 0x2d, 0x7c, 0x16, 0x47, - 0xb4, 0xe5, 0x4f, 0x1e, 0xed, 0xbc, 0xa4, 0xf5, 0x06, 0x57, - 0xfd, 0xac, 0x5f, 0x0e, 0x6f, 0x3e, 0xcd, 0x9c, 0x36, 0x67, - 0x94, 0xc5, 0xdd, 0x8c, 0x7f, 0x2e, 0x84, 0xd5, 0x26, 0x77, - 0xe4, 0xb5, 0x46, 0x17, 0xbd, 0xec, 0x1f, 0x4e, 0x56, 0x07, - 0xf4, 0xa5, 0x0f, 0x5e, 0xad, 0xfc, 0x9d, 0xcc, 0x3f, 0x6e, - 0xc4, 0x95, 0x66, 0x37, 0x2f, 0x7e, 0x8d, 0xdc, 0x76, 0x27, - 0xd4, 0x85, 0x00, 0x52, 0xa4, 0xf6, 0x55, 0x07, 0xf1, 0xa3, - 0xaa, 0xf8, 0x0e, 0x5c, 0xff, 0xad, 0x5b, 0x09, 0x49, 0x1b, - 0xed, 0xbf, 0x1c, 0x4e, 0xb8, 0xea, 0xe3, 0xb1, 0x47, 0x15, - 0xb6, 0xe4, 0x12, 0x40, 0x92, 0xc0, 0x36, 0x64, 0xc7, 0x95, - 0x63, 0x31, 0x38, 0x6a, 0x9c, 0xce, 0x6d, 0x3f, 0xc9, 0x9b, - 0xdb, 0x89, 0x7f, 0x2d, 0x8e, 0xdc, 0x2a, 0x78, 0x71, 0x23, - 0xd5, 0x87, 0x24, 0x76, 0x80, 0xd2, 0x39, 0x6b, 0x9d, 0xcf, - 0x6c, 0x3e, 0xc8, 0x9a, 0x93, 0xc1, 0x37, 0x65, 0xc6, 0x94, - 0x62, 0x30, 0x70, 0x22, 0xd4, 0x86, 0x25, 0x77, 0x81, 0xd3, - 0xda, 0x88, 0x7e, 0x2c, 0x8f, 0xdd, 0x2b, 0x79, 0xab, 0xf9, - 0x0f, 0x5d, 0xfe, 0xac, 0x5a, 0x08, 0x01, 0x53, 0xa5, 0xf7, - 0x54, 0x06, 0xf0, 0xa2, 0xe2, 0xb0, 0x46, 0x14, 0xb7, 0xe5, - 0x13, 0x41, 0x48, 0x1a, 0xec, 0xbe, 0x1d, 0x4f, 0xb9, 0xeb, - 0x72, 0x20, 0xd6, 0x84, 0x27, 0x75, 0x83, 0xd1, 0xd8, 0x8a, - 0x7c, 0x2e, 0x8d, 0xdf, 0x29, 0x7b, 0x3b, 0x69, 0x9f, 0xcd, - 0x6e, 0x3c, 0xca, 0x98, 0x91, 0xc3, 0x35, 0x67, 0xc4, 0x96, - 0x60, 0x32, 0xe0, 0xb2, 0x44, 0x16, 0xb5, 0xe7, 0x11, 0x43, - 0x4a, 0x18, 0xee, 0xbc, 0x1f, 0x4d, 0xbb, 0xe9, 0xa9, 0xfb, - 0x0d, 0x5f, 0xfc, 0xae, 0x58, 0x0a, 0x03, 0x51, 0xa7, 0xf5, - 0x56, 0x04, 0xf2, 0xa0, 0x4b, 0x19, 0xef, 0xbd, 0x1e, 0x4c, - 0xba, 0xe8, 0xe1, 0xb3, 0x45, 0x17, 0xb4, 0xe6, 0x10, 0x42, - 0x02, 0x50, 0xa6, 0xf4, 0x57, 0x05, 0xf3, 0xa1, 0xa8, 0xfa, - 0x0c, 0x5e, 0xfd, 0xaf, 0x59, 0x0b, 0xd9, 0x8b, 0x7d, 0x2f, - 0x8c, 0xde, 0x28, 0x7a, 0x73, 0x21, 0xd7, 0x85, 0x26, 0x74, - 0x82, 0xd0, 0x90, 0xc2, 0x34, 0x66, 0xc5, 0x97, 0x61, 0x33, - 0x3a, 0x68, 0x9e, 0xcc, 0x6f, 0x3d, 0xcb, 0x99, 0x00, 0x53, - 0xa6, 0xf5, 0x51, 0x02, 0xf7, 0xa4, 0xa2, 0xf1, 0x04, 0x57, - 0xf3, 0xa0, 0x55, 0x06, 0x59, 0x0a, 0xff, 0xac, 0x08, 0x5b, - 0xae, 0xfd, 0xfb, 0xa8, 0x5d, 0x0e, 0xaa, 0xf9, 0x0c, 0x5f, - 0xb2, 0xe1, 0x14, 0x47, 0xe3, 0xb0, 0x45, 0x16, 0x10, 0x43, - 0xb6, 0xe5, 0x41, 0x12, 0xe7, 0xb4, 0xeb, 0xb8, 0x4d, 0x1e, - 0xba, 0xe9, 0x1c, 0x4f, 0x49, 0x1a, 0xef, 0xbc, 0x18, 0x4b, - 0xbe, 0xed, 0x79, 0x2a, 0xdf, 0x8c, 0x28, 0x7b, 0x8e, 0xdd, - 0xdb, 0x88, 0x7d, 0x2e, 0x8a, 0xd9, 0x2c, 0x7f, 0x20, 0x73, - 0x86, 0xd5, 0x71, 0x22, 0xd7, 0x84, 0x82, 0xd1, 0x24, 0x77, - 0xd3, 0x80, 0x75, 0x26, 0xcb, 0x98, 0x6d, 0x3e, 0x9a, 0xc9, - 0x3c, 0x6f, 0x69, 0x3a, 0xcf, 0x9c, 0x38, 0x6b, 0x9e, 0xcd, - 0x92, 0xc1, 0x34, 0x67, 0xc3, 0x90, 0x65, 0x36, 0x30, 0x63, - 0x96, 0xc5, 0x61, 0x32, 0xc7, 0x94, 0xf2, 0xa1, 0x54, 0x07, - 0xa3, 0xf0, 0x05, 0x56, 0x50, 0x03, 0xf6, 0xa5, 0x01, 0x52, - 0xa7, 0xf4, 0xab, 0xf8, 0x0d, 0x5e, 0xfa, 0xa9, 0x5c, 0x0f, - 0x09, 0x5a, 0xaf, 0xfc, 0x58, 0x0b, 0xfe, 0xad, 0x40, 0x13, - 0xe6, 0xb5, 0x11, 0x42, 0xb7, 0xe4, 0xe2, 0xb1, 0x44, 0x17, - 0xb3, 0xe0, 0x15, 0x46, 0x19, 0x4a, 0xbf, 0xec, 0x48, 0x1b, - 0xee, 0xbd, 0xbb, 0xe8, 0x1d, 0x4e, 0xea, 0xb9, 0x4c, 0x1f, - 0x8b, 0xd8, 0x2d, 0x7e, 0xda, 0x89, 0x7c, 0x2f, 0x29, 0x7a, - 0x8f, 0xdc, 0x78, 0x2b, 0xde, 0x8d, 0xd2, 0x81, 0x74, 0x27, - 0x83, 0xd0, 0x25, 0x76, 0x70, 0x23, 0xd6, 0x85, 0x21, 0x72, - 0x87, 0xd4, 0x39, 0x6a, 0x9f, 0xcc, 0x68, 0x3b, 0xce, 0x9d, - 0x9b, 0xc8, 0x3d, 0x6e, 0xca, 0x99, 0x6c, 0x3f, 0x60, 0x33, - 0xc6, 0x95, 0x31, 0x62, 0x97, 0xc4, 0xc2, 0x91, 0x64, 0x37, - 0x93, 0xc0, 0x35, 0x66, 0x00, 0x54, 0xa8, 0xfc, 0x4d, 0x19, - 0xe5, 0xb1, 0x9a, 0xce, 0x32, 0x66, 0xd7, 0x83, 0x7f, 0x2b, - 0x29, 0x7d, 0x81, 0xd5, 0x64, 0x30, 0xcc, 0x98, 0xb3, 0xe7, - 0x1b, 0x4f, 0xfe, 0xaa, 0x56, 0x02, 0x52, 0x06, 0xfa, 0xae, - 0x1f, 0x4b, 0xb7, 0xe3, 0xc8, 0x9c, 0x60, 0x34, 0x85, 0xd1, - 0x2d, 0x79, 0x7b, 0x2f, 0xd3, 0x87, 0x36, 0x62, 0x9e, 0xca, - 0xe1, 0xb5, 0x49, 0x1d, 0xac, 0xf8, 0x04, 0x50, 0xa4, 0xf0, - 0x0c, 0x58, 0xe9, 0xbd, 0x41, 0x15, 0x3e, 0x6a, 0x96, 0xc2, - 0x73, 0x27, 0xdb, 0x8f, 0x8d, 0xd9, 0x25, 0x71, 0xc0, 0x94, - 0x68, 0x3c, 0x17, 0x43, 0xbf, 0xeb, 0x5a, 0x0e, 0xf2, 0xa6, - 0xf6, 0xa2, 0x5e, 0x0a, 0xbb, 0xef, 0x13, 0x47, 0x6c, 0x38, - 0xc4, 0x90, 0x21, 0x75, 0x89, 0xdd, 0xdf, 0x8b, 0x77, 0x23, - 0x92, 0xc6, 0x3a, 0x6e, 0x45, 0x11, 0xed, 0xb9, 0x08, 0x5c, - 0xa0, 0xf4, 0x55, 0x01, 0xfd, 0xa9, 0x18, 0x4c, 0xb0, 0xe4, - 0xcf, 0x9b, 0x67, 0x33, 0x82, 0xd6, 0x2a, 0x7e, 0x7c, 0x28, - 0xd4, 0x80, 0x31, 0x65, 0x99, 0xcd, 0xe6, 0xb2, 0x4e, 0x1a, - 0xab, 0xff, 0x03, 0x57, 0x07, 0x53, 0xaf, 0xfb, 0x4a, 0x1e, - 0xe2, 0xb6, 0x9d, 0xc9, 0x35, 0x61, 0xd0, 0x84, 0x78, 0x2c, - 0x2e, 0x7a, 0x86, 0xd2, 0x63, 0x37, 0xcb, 0x9f, 0xb4, 0xe0, - 0x1c, 0x48, 0xf9, 0xad, 0x51, 0x05, 0xf1, 0xa5, 0x59, 0x0d, - 0xbc, 0xe8, 0x14, 0x40, 0x6b, 0x3f, 0xc3, 0x97, 0x26, 0x72, - 0x8e, 0xda, 0xd8, 0x8c, 0x70, 0x24, 0x95, 0xc1, 0x3d, 0x69, - 0x42, 0x16, 0xea, 0xbe, 0x0f, 0x5b, 0xa7, 0xf3, 0xa3, 0xf7, - 0x0b, 0x5f, 0xee, 0xba, 0x46, 0x12, 0x39, 0x6d, 0x91, 0xc5, - 0x74, 0x20, 0xdc, 0x88, 0x8a, 0xde, 0x22, 0x76, 0xc7, 0x93, - 0x6f, 0x3b, 0x10, 0x44, 0xb8, 0xec, 0x5d, 0x09, 0xf5, 0xa1, - 0x00, 0x55, 0xaa, 0xff, 0x49, 0x1c, 0xe3, 0xb6, 0x92, 0xc7, - 0x38, 0x6d, 0xdb, 0x8e, 0x71, 0x24, 0x39, 0x6c, 0x93, 0xc6, - 0x70, 0x25, 0xda, 0x8f, 0xab, 0xfe, 0x01, 0x54, 0xe2, 0xb7, - 0x48, 0x1d, 0x72, 0x27, 0xd8, 0x8d, 0x3b, 0x6e, 0x91, 0xc4, - 0xe0, 0xb5, 0x4a, 0x1f, 0xa9, 0xfc, 0x03, 0x56, 0x4b, 0x1e, - 0xe1, 0xb4, 0x02, 0x57, 0xa8, 0xfd, 0xd9, 0x8c, 0x73, 0x26, - 0x90, 0xc5, 0x3a, 0x6f, 0xe4, 0xb1, 0x4e, 0x1b, 0xad, 0xf8, - 0x07, 0x52, 0x76, 0x23, 0xdc, 0x89, 0x3f, 0x6a, 0x95, 0xc0, - 0xdd, 0x88, 0x77, 0x22, 0x94, 0xc1, 0x3e, 0x6b, 0x4f, 0x1a, - 0xe5, 0xb0, 0x06, 0x53, 0xac, 0xf9, 0x96, 0xc3, 0x3c, 0x69, - 0xdf, 0x8a, 0x75, 0x20, 0x04, 0x51, 0xae, 0xfb, 0x4d, 0x18, - 0xe7, 0xb2, 0xaf, 0xfa, 0x05, 0x50, 0xe6, 0xb3, 0x4c, 0x19, - 0x3d, 0x68, 0x97, 0xc2, 0x74, 0x21, 0xde, 0x8b, 0xd5, 0x80, - 0x7f, 0x2a, 0x9c, 0xc9, 0x36, 0x63, 0x47, 0x12, 0xed, 0xb8, - 0x0e, 0x5b, 0xa4, 0xf1, 0xec, 0xb9, 0x46, 0x13, 0xa5, 0xf0, - 0x0f, 0x5a, 0x7e, 0x2b, 0xd4, 0x81, 0x37, 0x62, 0x9d, 0xc8, - 0xa7, 0xf2, 0x0d, 0x58, 0xee, 0xbb, 0x44, 0x11, 0x35, 0x60, - 0x9f, 0xca, 0x7c, 0x29, 0xd6, 0x83, 0x9e, 0xcb, 0x34, 0x61, - 0xd7, 0x82, 0x7d, 0x28, 0x0c, 0x59, 0xa6, 0xf3, 0x45, 0x10, - 0xef, 0xba, 0x31, 0x64, 0x9b, 0xce, 0x78, 0x2d, 0xd2, 0x87, - 0xa3, 0xf6, 0x09, 0x5c, 0xea, 0xbf, 0x40, 0x15, 0x08, 0x5d, - 0xa2, 0xf7, 0x41, 0x14, 0xeb, 0xbe, 0x9a, 0xcf, 0x30, 0x65, - 0xd3, 0x86, 0x79, 0x2c, 0x43, 0x16, 0xe9, 0xbc, 0x0a, 0x5f, - 0xa0, 0xf5, 0xd1, 0x84, 0x7b, 0x2e, 0x98, 0xcd, 0x32, 0x67, - 0x7a, 0x2f, 0xd0, 0x85, 0x33, 0x66, 0x99, 0xcc, 0xe8, 0xbd, - 0x42, 0x17, 0xa1, 0xf4, 0x0b, 0x5e, 0x00, 0x56, 0xac, 0xfa, - 0x45, 0x13, 0xe9, 0xbf, 0x8a, 0xdc, 0x26, 0x70, 0xcf, 0x99, - 0x63, 0x35, 0x09, 0x5f, 0xa5, 0xf3, 0x4c, 0x1a, 0xe0, 0xb6, - 0x83, 0xd5, 0x2f, 0x79, 0xc6, 0x90, 0x6a, 0x3c, 0x12, 0x44, - 0xbe, 0xe8, 0x57, 0x01, 0xfb, 0xad, 0x98, 0xce, 0x34, 0x62, - 0xdd, 0x8b, 0x71, 0x27, 0x1b, 0x4d, 0xb7, 0xe1, 0x5e, 0x08, - 0xf2, 0xa4, 0x91, 0xc7, 0x3d, 0x6b, 0xd4, 0x82, 0x78, 0x2e, - 0x24, 0x72, 0x88, 0xde, 0x61, 0x37, 0xcd, 0x9b, 0xae, 0xf8, - 0x02, 0x54, 0xeb, 0xbd, 0x47, 0x11, 0x2d, 0x7b, 0x81, 0xd7, - 0x68, 0x3e, 0xc4, 0x92, 0xa7, 0xf1, 0x0b, 0x5d, 0xe2, 0xb4, - 0x4e, 0x18, 0x36, 0x60, 0x9a, 0xcc, 0x73, 0x25, 0xdf, 0x89, - 0xbc, 0xea, 0x10, 0x46, 0xf9, 0xaf, 0x55, 0x03, 0x3f, 0x69, - 0x93, 0xc5, 0x7a, 0x2c, 0xd6, 0x80, 0xb5, 0xe3, 0x19, 0x4f, - 0xf0, 0xa6, 0x5c, 0x0a, 0x48, 0x1e, 0xe4, 0xb2, 0x0d, 0x5b, - 0xa1, 0xf7, 0xc2, 0x94, 0x6e, 0x38, 0x87, 0xd1, 0x2b, 0x7d, - 0x41, 0x17, 0xed, 0xbb, 0x04, 0x52, 0xa8, 0xfe, 0xcb, 0x9d, - 0x67, 0x31, 0x8e, 0xd8, 0x22, 0x74, 0x5a, 0x0c, 0xf6, 0xa0, - 0x1f, 0x49, 0xb3, 0xe5, 0xd0, 0x86, 0x7c, 0x2a, 0x95, 0xc3, - 0x39, 0x6f, 0x53, 0x05, 0xff, 0xa9, 0x16, 0x40, 0xba, 0xec, - 0xd9, 0x8f, 0x75, 0x23, 0x9c, 0xca, 0x30, 0x66, 0x6c, 0x3a, - 0xc0, 0x96, 0x29, 0x7f, 0x85, 0xd3, 0xe6, 0xb0, 0x4a, 0x1c, - 0xa3, 0xf5, 0x0f, 0x59, 0x65, 0x33, 0xc9, 0x9f, 0x20, 0x76, - 0x8c, 0xda, 0xef, 0xb9, 0x43, 0x15, 0xaa, 0xfc, 0x06, 0x50, - 0x7e, 0x28, 0xd2, 0x84, 0x3b, 0x6d, 0x97, 0xc1, 0xf4, 0xa2, - 0x58, 0x0e, 0xb1, 0xe7, 0x1d, 0x4b, 0x77, 0x21, 0xdb, 0x8d, - 0x32, 0x64, 0x9e, 0xc8, 0xfd, 0xab, 0x51, 0x07, 0xb8, 0xee, - 0x14, 0x42, 0x00, 0x57, 0xae, 0xf9, 0x41, 0x16, 0xef, 0xb8, - 0x82, 0xd5, 0x2c, 0x7b, 0xc3, 0x94, 0x6d, 0x3a, 0x19, 0x4e, - 0xb7, 0xe0, 0x58, 0x0f, 0xf6, 0xa1, 0x9b, 0xcc, 0x35, 0x62, - 0xda, 0x8d, 0x74, 0x23, 0x32, 0x65, 0x9c, 0xcb, 0x73, 0x24, - 0xdd, 0x8a, 0xb0, 0xe7, 0x1e, 0x49, 0xf1, 0xa6, 0x5f, 0x08, - 0x2b, 0x7c, 0x85, 0xd2, 0x6a, 0x3d, 0xc4, 0x93, 0xa9, 0xfe, - 0x07, 0x50, 0xe8, 0xbf, 0x46, 0x11, 0x64, 0x33, 0xca, 0x9d, - 0x25, 0x72, 0x8b, 0xdc, 0xe6, 0xb1, 0x48, 0x1f, 0xa7, 0xf0, - 0x09, 0x5e, 0x7d, 0x2a, 0xd3, 0x84, 0x3c, 0x6b, 0x92, 0xc5, - 0xff, 0xa8, 0x51, 0x06, 0xbe, 0xe9, 0x10, 0x47, 0x56, 0x01, - 0xf8, 0xaf, 0x17, 0x40, 0xb9, 0xee, 0xd4, 0x83, 0x7a, 0x2d, - 0x95, 0xc2, 0x3b, 0x6c, 0x4f, 0x18, 0xe1, 0xb6, 0x0e, 0x59, - 0xa0, 0xf7, 0xcd, 0x9a, 0x63, 0x34, 0x8c, 0xdb, 0x22, 0x75, - 0xc8, 0x9f, 0x66, 0x31, 0x89, 0xde, 0x27, 0x70, 0x4a, 0x1d, - 0xe4, 0xb3, 0x0b, 0x5c, 0xa5, 0xf2, 0xd1, 0x86, 0x7f, 0x28, - 0x90, 0xc7, 0x3e, 0x69, 0x53, 0x04, 0xfd, 0xaa, 0x12, 0x45, - 0xbc, 0xeb, 0xfa, 0xad, 0x54, 0x03, 0xbb, 0xec, 0x15, 0x42, - 0x78, 0x2f, 0xd6, 0x81, 0x39, 0x6e, 0x97, 0xc0, 0xe3, 0xb4, - 0x4d, 0x1a, 0xa2, 0xf5, 0x0c, 0x5b, 0x61, 0x36, 0xcf, 0x98, - 0x20, 0x77, 0x8e, 0xd9, 0xac, 0xfb, 0x02, 0x55, 0xed, 0xba, - 0x43, 0x14, 0x2e, 0x79, 0x80, 0xd7, 0x6f, 0x38, 0xc1, 0x96, - 0xb5, 0xe2, 0x1b, 0x4c, 0xf4, 0xa3, 0x5a, 0x0d, 0x37, 0x60, - 0x99, 0xce, 0x76, 0x21, 0xd8, 0x8f, 0x9e, 0xc9, 0x30, 0x67, - 0xdf, 0x88, 0x71, 0x26, 0x1c, 0x4b, 0xb2, 0xe5, 0x5d, 0x0a, - 0xf3, 0xa4, 0x87, 0xd0, 0x29, 0x7e, 0xc6, 0x91, 0x68, 0x3f, - 0x05, 0x52, 0xab, 0xfc, 0x44, 0x13, 0xea, 0xbd, 0x00, 0x58, - 0xb0, 0xe8, 0x7d, 0x25, 0xcd, 0x95, 0xfa, 0xa2, 0x4a, 0x12, - 0x87, 0xdf, 0x37, 0x6f, 0xe9, 0xb1, 0x59, 0x01, 0x94, 0xcc, - 0x24, 0x7c, 0x13, 0x4b, 0xa3, 0xfb, 0x6e, 0x36, 0xde, 0x86, - 0xcf, 0x97, 0x7f, 0x27, 0xb2, 0xea, 0x02, 0x5a, 0x35, 0x6d, - 0x85, 0xdd, 0x48, 0x10, 0xf8, 0xa0, 0x26, 0x7e, 0x96, 0xce, - 0x5b, 0x03, 0xeb, 0xb3, 0xdc, 0x84, 0x6c, 0x34, 0xa1, 0xf9, - 0x11, 0x49, 0x83, 0xdb, 0x33, 0x6b, 0xfe, 0xa6, 0x4e, 0x16, - 0x79, 0x21, 0xc9, 0x91, 0x04, 0x5c, 0xb4, 0xec, 0x6a, 0x32, - 0xda, 0x82, 0x17, 0x4f, 0xa7, 0xff, 0x90, 0xc8, 0x20, 0x78, - 0xed, 0xb5, 0x5d, 0x05, 0x4c, 0x14, 0xfc, 0xa4, 0x31, 0x69, - 0x81, 0xd9, 0xb6, 0xee, 0x06, 0x5e, 0xcb, 0x93, 0x7b, 0x23, - 0xa5, 0xfd, 0x15, 0x4d, 0xd8, 0x80, 0x68, 0x30, 0x5f, 0x07, - 0xef, 0xb7, 0x22, 0x7a, 0x92, 0xca, 0x1b, 0x43, 0xab, 0xf3, - 0x66, 0x3e, 0xd6, 0x8e, 0xe1, 0xb9, 0x51, 0x09, 0x9c, 0xc4, - 0x2c, 0x74, 0xf2, 0xaa, 0x42, 0x1a, 0x8f, 0xd7, 0x3f, 0x67, - 0x08, 0x50, 0xb8, 0xe0, 0x75, 0x2d, 0xc5, 0x9d, 0xd4, 0x8c, - 0x64, 0x3c, 0xa9, 0xf1, 0x19, 0x41, 0x2e, 0x76, 0x9e, 0xc6, - 0x53, 0x0b, 0xe3, 0xbb, 0x3d, 0x65, 0x8d, 0xd5, 0x40, 0x18, - 0xf0, 0xa8, 0xc7, 0x9f, 0x77, 0x2f, 0xba, 0xe2, 0x0a, 0x52, - 0x98, 0xc0, 0x28, 0x70, 0xe5, 0xbd, 0x55, 0x0d, 0x62, 0x3a, - 0xd2, 0x8a, 0x1f, 0x47, 0xaf, 0xf7, 0x71, 0x29, 0xc1, 0x99, - 0x0c, 0x54, 0xbc, 0xe4, 0x8b, 0xd3, 0x3b, 0x63, 0xf6, 0xae, - 0x46, 0x1e, 0x57, 0x0f, 0xe7, 0xbf, 0x2a, 0x72, 0x9a, 0xc2, - 0xad, 0xf5, 0x1d, 0x45, 0xd0, 0x88, 0x60, 0x38, 0xbe, 0xe6, - 0x0e, 0x56, 0xc3, 0x9b, 0x73, 0x2b, 0x44, 0x1c, 0xf4, 0xac, - 0x39, 0x61, 0x89, 0xd1, 0x00, 0x59, 0xb2, 0xeb, 0x79, 0x20, - 0xcb, 0x92, 0xf2, 0xab, 0x40, 0x19, 0x8b, 0xd2, 0x39, 0x60, - 0xf9, 0xa0, 0x4b, 0x12, 0x80, 0xd9, 0x32, 0x6b, 0x0b, 0x52, - 0xb9, 0xe0, 0x72, 0x2b, 0xc0, 0x99, 0xef, 0xb6, 0x5d, 0x04, - 0x96, 0xcf, 0x24, 0x7d, 0x1d, 0x44, 0xaf, 0xf6, 0x64, 0x3d, - 0xd6, 0x8f, 0x16, 0x4f, 0xa4, 0xfd, 0x6f, 0x36, 0xdd, 0x84, - 0xe4, 0xbd, 0x56, 0x0f, 0x9d, 0xc4, 0x2f, 0x76, 0xc3, 0x9a, - 0x71, 0x28, 0xba, 0xe3, 0x08, 0x51, 0x31, 0x68, 0x83, 0xda, - 0x48, 0x11, 0xfa, 0xa3, 0x3a, 0x63, 0x88, 0xd1, 0x43, 0x1a, - 0xf1, 0xa8, 0xc8, 0x91, 0x7a, 0x23, 0xb1, 0xe8, 0x03, 0x5a, - 0x2c, 0x75, 0x9e, 0xc7, 0x55, 0x0c, 0xe7, 0xbe, 0xde, 0x87, - 0x6c, 0x35, 0xa7, 0xfe, 0x15, 0x4c, 0xd5, 0x8c, 0x67, 0x3e, - 0xac, 0xf5, 0x1e, 0x47, 0x27, 0x7e, 0x95, 0xcc, 0x5e, 0x07, - 0xec, 0xb5, 0x9b, 0xc2, 0x29, 0x70, 0xe2, 0xbb, 0x50, 0x09, - 0x69, 0x30, 0xdb, 0x82, 0x10, 0x49, 0xa2, 0xfb, 0x62, 0x3b, - 0xd0, 0x89, 0x1b, 0x42, 0xa9, 0xf0, 0x90, 0xc9, 0x22, 0x7b, - 0xe9, 0xb0, 0x5b, 0x02, 0x74, 0x2d, 0xc6, 0x9f, 0x0d, 0x54, - 0xbf, 0xe6, 0x86, 0xdf, 0x34, 0x6d, 0xff, 0xa6, 0x4d, 0x14, - 0x8d, 0xd4, 0x3f, 0x66, 0xf4, 0xad, 0x46, 0x1f, 0x7f, 0x26, - 0xcd, 0x94, 0x06, 0x5f, 0xb4, 0xed, 0x58, 0x01, 0xea, 0xb3, - 0x21, 0x78, 0x93, 0xca, 0xaa, 0xf3, 0x18, 0x41, 0xd3, 0x8a, - 0x61, 0x38, 0xa1, 0xf8, 0x13, 0x4a, 0xd8, 0x81, 0x6a, 0x33, - 0x53, 0x0a, 0xe1, 0xb8, 0x2a, 0x73, 0x98, 0xc1, 0xb7, 0xee, - 0x05, 0x5c, 0xce, 0x97, 0x7c, 0x25, 0x45, 0x1c, 0xf7, 0xae, - 0x3c, 0x65, 0x8e, 0xd7, 0x4e, 0x17, 0xfc, 0xa5, 0x37, 0x6e, - 0x85, 0xdc, 0xbc, 0xe5, 0x0e, 0x57, 0xc5, 0x9c, 0x77, 0x2e, - 0x00, 0x5a, 0xb4, 0xee, 0x75, 0x2f, 0xc1, 0x9b, 0xea, 0xb0, - 0x5e, 0x04, 0x9f, 0xc5, 0x2b, 0x71, 0xc9, 0x93, 0x7d, 0x27, - 0xbc, 0xe6, 0x08, 0x52, 0x23, 0x79, 0x97, 0xcd, 0x56, 0x0c, - 0xe2, 0xb8, 0x8f, 0xd5, 0x3b, 0x61, 0xfa, 0xa0, 0x4e, 0x14, - 0x65, 0x3f, 0xd1, 0x8b, 0x10, 0x4a, 0xa4, 0xfe, 0x46, 0x1c, - 0xf2, 0xa8, 0x33, 0x69, 0x87, 0xdd, 0xac, 0xf6, 0x18, 0x42, - 0xd9, 0x83, 0x6d, 0x37, 0x03, 0x59, 0xb7, 0xed, 0x76, 0x2c, - 0xc2, 0x98, 0xe9, 0xb3, 0x5d, 0x07, 0x9c, 0xc6, 0x28, 0x72, - 0xca, 0x90, 0x7e, 0x24, 0xbf, 0xe5, 0x0b, 0x51, 0x20, 0x7a, - 0x94, 0xce, 0x55, 0x0f, 0xe1, 0xbb, 0x8c, 0xd6, 0x38, 0x62, - 0xf9, 0xa3, 0x4d, 0x17, 0x66, 0x3c, 0xd2, 0x88, 0x13, 0x49, - 0xa7, 0xfd, 0x45, 0x1f, 0xf1, 0xab, 0x30, 0x6a, 0x84, 0xde, - 0xaf, 0xf5, 0x1b, 0x41, 0xda, 0x80, 0x6e, 0x34, 0x06, 0x5c, - 0xb2, 0xe8, 0x73, 0x29, 0xc7, 0x9d, 0xec, 0xb6, 0x58, 0x02, - 0x99, 0xc3, 0x2d, 0x77, 0xcf, 0x95, 0x7b, 0x21, 0xba, 0xe0, - 0x0e, 0x54, 0x25, 0x7f, 0x91, 0xcb, 0x50, 0x0a, 0xe4, 0xbe, - 0x89, 0xd3, 0x3d, 0x67, 0xfc, 0xa6, 0x48, 0x12, 0x63, 0x39, - 0xd7, 0x8d, 0x16, 0x4c, 0xa2, 0xf8, 0x40, 0x1a, 0xf4, 0xae, - 0x35, 0x6f, 0x81, 0xdb, 0xaa, 0xf0, 0x1e, 0x44, 0xdf, 0x85, - 0x6b, 0x31, 0x05, 0x5f, 0xb1, 0xeb, 0x70, 0x2a, 0xc4, 0x9e, - 0xef, 0xb5, 0x5b, 0x01, 0x9a, 0xc0, 0x2e, 0x74, 0xcc, 0x96, - 0x78, 0x22, 0xb9, 0xe3, 0x0d, 0x57, 0x26, 0x7c, 0x92, 0xc8, - 0x53, 0x09, 0xe7, 0xbd, 0x8a, 0xd0, 0x3e, 0x64, 0xff, 0xa5, - 0x4b, 0x11, 0x60, 0x3a, 0xd4, 0x8e, 0x15, 0x4f, 0xa1, 0xfb, - 0x43, 0x19, 0xf7, 0xad, 0x36, 0x6c, 0x82, 0xd8, 0xa9, 0xf3, - 0x1d, 0x47, 0xdc, 0x86, 0x68, 0x32, 0x00, 0x5b, 0xb6, 0xed, - 0x71, 0x2a, 0xc7, 0x9c, 0xe2, 0xb9, 0x54, 0x0f, 0x93, 0xc8, - 0x25, 0x7e, 0xd9, 0x82, 0x6f, 0x34, 0xa8, 0xf3, 0x1e, 0x45, - 0x3b, 0x60, 0x8d, 0xd6, 0x4a, 0x11, 0xfc, 0xa7, 0xaf, 0xf4, - 0x19, 0x42, 0xde, 0x85, 0x68, 0x33, 0x4d, 0x16, 0xfb, 0xa0, - 0x3c, 0x67, 0x8a, 0xd1, 0x76, 0x2d, 0xc0, 0x9b, 0x07, 0x5c, - 0xb1, 0xea, 0x94, 0xcf, 0x22, 0x79, 0xe5, 0xbe, 0x53, 0x08, - 0x43, 0x18, 0xf5, 0xae, 0x32, 0x69, 0x84, 0xdf, 0xa1, 0xfa, - 0x17, 0x4c, 0xd0, 0x8b, 0x66, 0x3d, 0x9a, 0xc1, 0x2c, 0x77, - 0xeb, 0xb0, 0x5d, 0x06, 0x78, 0x23, 0xce, 0x95, 0x09, 0x52, - 0xbf, 0xe4, 0xec, 0xb7, 0x5a, 0x01, 0x9d, 0xc6, 0x2b, 0x70, - 0x0e, 0x55, 0xb8, 0xe3, 0x7f, 0x24, 0xc9, 0x92, 0x35, 0x6e, - 0x83, 0xd8, 0x44, 0x1f, 0xf2, 0xa9, 0xd7, 0x8c, 0x61, 0x3a, - 0xa6, 0xfd, 0x10, 0x4b, 0x86, 0xdd, 0x30, 0x6b, 0xf7, 0xac, - 0x41, 0x1a, 0x64, 0x3f, 0xd2, 0x89, 0x15, 0x4e, 0xa3, 0xf8, - 0x5f, 0x04, 0xe9, 0xb2, 0x2e, 0x75, 0x98, 0xc3, 0xbd, 0xe6, - 0x0b, 0x50, 0xcc, 0x97, 0x7a, 0x21, 0x29, 0x72, 0x9f, 0xc4, - 0x58, 0x03, 0xee, 0xb5, 0xcb, 0x90, 0x7d, 0x26, 0xba, 0xe1, - 0x0c, 0x57, 0xf0, 0xab, 0x46, 0x1d, 0x81, 0xda, 0x37, 0x6c, - 0x12, 0x49, 0xa4, 0xff, 0x63, 0x38, 0xd5, 0x8e, 0xc5, 0x9e, - 0x73, 0x28, 0xb4, 0xef, 0x02, 0x59, 0x27, 0x7c, 0x91, 0xca, - 0x56, 0x0d, 0xe0, 0xbb, 0x1c, 0x47, 0xaa, 0xf1, 0x6d, 0x36, - 0xdb, 0x80, 0xfe, 0xa5, 0x48, 0x13, 0x8f, 0xd4, 0x39, 0x62, - 0x6a, 0x31, 0xdc, 0x87, 0x1b, 0x40, 0xad, 0xf6, 0x88, 0xd3, - 0x3e, 0x65, 0xf9, 0xa2, 0x4f, 0x14, 0xb3, 0xe8, 0x05, 0x5e, - 0xc2, 0x99, 0x74, 0x2f, 0x51, 0x0a, 0xe7, 0xbc, 0x20, 0x7b, - 0x96, 0xcd, 0x00, 0x5c, 0xb8, 0xe4, 0x6d, 0x31, 0xd5, 0x89, - 0xda, 0x86, 0x62, 0x3e, 0xb7, 0xeb, 0x0f, 0x53, 0xa9, 0xf5, - 0x11, 0x4d, 0xc4, 0x98, 0x7c, 0x20, 0x73, 0x2f, 0xcb, 0x97, - 0x1e, 0x42, 0xa6, 0xfa, 0x4f, 0x13, 0xf7, 0xab, 0x22, 0x7e, - 0x9a, 0xc6, 0x95, 0xc9, 0x2d, 0x71, 0xf8, 0xa4, 0x40, 0x1c, - 0xe6, 0xba, 0x5e, 0x02, 0x8b, 0xd7, 0x33, 0x6f, 0x3c, 0x60, - 0x84, 0xd8, 0x51, 0x0d, 0xe9, 0xb5, 0x9e, 0xc2, 0x26, 0x7a, - 0xf3, 0xaf, 0x4b, 0x17, 0x44, 0x18, 0xfc, 0xa0, 0x29, 0x75, - 0x91, 0xcd, 0x37, 0x6b, 0x8f, 0xd3, 0x5a, 0x06, 0xe2, 0xbe, - 0xed, 0xb1, 0x55, 0x09, 0x80, 0xdc, 0x38, 0x64, 0xd1, 0x8d, - 0x69, 0x35, 0xbc, 0xe0, 0x04, 0x58, 0x0b, 0x57, 0xb3, 0xef, - 0x66, 0x3a, 0xde, 0x82, 0x78, 0x24, 0xc0, 0x9c, 0x15, 0x49, - 0xad, 0xf1, 0xa2, 0xfe, 0x1a, 0x46, 0xcf, 0x93, 0x77, 0x2b, - 0x21, 0x7d, 0x99, 0xc5, 0x4c, 0x10, 0xf4, 0xa8, 0xfb, 0xa7, - 0x43, 0x1f, 0x96, 0xca, 0x2e, 0x72, 0x88, 0xd4, 0x30, 0x6c, - 0xe5, 0xb9, 0x5d, 0x01, 0x52, 0x0e, 0xea, 0xb6, 0x3f, 0x63, - 0x87, 0xdb, 0x6e, 0x32, 0xd6, 0x8a, 0x03, 0x5f, 0xbb, 0xe7, - 0xb4, 0xe8, 0x0c, 0x50, 0xd9, 0x85, 0x61, 0x3d, 0xc7, 0x9b, - 0x7f, 0x23, 0xaa, 0xf6, 0x12, 0x4e, 0x1d, 0x41, 0xa5, 0xf9, - 0x70, 0x2c, 0xc8, 0x94, 0xbf, 0xe3, 0x07, 0x5b, 0xd2, 0x8e, - 0x6a, 0x36, 0x65, 0x39, 0xdd, 0x81, 0x08, 0x54, 0xb0, 0xec, - 0x16, 0x4a, 0xae, 0xf2, 0x7b, 0x27, 0xc3, 0x9f, 0xcc, 0x90, - 0x74, 0x28, 0xa1, 0xfd, 0x19, 0x45, 0xf0, 0xac, 0x48, 0x14, - 0x9d, 0xc1, 0x25, 0x79, 0x2a, 0x76, 0x92, 0xce, 0x47, 0x1b, - 0xff, 0xa3, 0x59, 0x05, 0xe1, 0xbd, 0x34, 0x68, 0x8c, 0xd0, - 0x83, 0xdf, 0x3b, 0x67, 0xee, 0xb2, 0x56, 0x0a, 0x00, 0x5d, - 0xba, 0xe7, 0x69, 0x34, 0xd3, 0x8e, 0xd2, 0x8f, 0x68, 0x35, - 0xbb, 0xe6, 0x01, 0x5c, 0xb9, 0xe4, 0x03, 0x5e, 0xd0, 0x8d, - 0x6a, 0x37, 0x6b, 0x36, 0xd1, 0x8c, 0x02, 0x5f, 0xb8, 0xe5, - 0x6f, 0x32, 0xd5, 0x88, 0x06, 0x5b, 0xbc, 0xe1, 0xbd, 0xe0, - 0x07, 0x5a, 0xd4, 0x89, 0x6e, 0x33, 0xd6, 0x8b, 0x6c, 0x31, - 0xbf, 0xe2, 0x05, 0x58, 0x04, 0x59, 0xbe, 0xe3, 0x6d, 0x30, - 0xd7, 0x8a, 0xde, 0x83, 0x64, 0x39, 0xb7, 0xea, 0x0d, 0x50, - 0x0c, 0x51, 0xb6, 0xeb, 0x65, 0x38, 0xdf, 0x82, 0x67, 0x3a, - 0xdd, 0x80, 0x0e, 0x53, 0xb4, 0xe9, 0xb5, 0xe8, 0x0f, 0x52, - 0xdc, 0x81, 0x66, 0x3b, 0xb1, 0xec, 0x0b, 0x56, 0xd8, 0x85, - 0x62, 0x3f, 0x63, 0x3e, 0xd9, 0x84, 0x0a, 0x57, 0xb0, 0xed, - 0x08, 0x55, 0xb2, 0xef, 0x61, 0x3c, 0xdb, 0x86, 0xda, 0x87, - 0x60, 0x3d, 0xb3, 0xee, 0x09, 0x54, 0xa1, 0xfc, 0x1b, 0x46, - 0xc8, 0x95, 0x72, 0x2f, 0x73, 0x2e, 0xc9, 0x94, 0x1a, 0x47, - 0xa0, 0xfd, 0x18, 0x45, 0xa2, 0xff, 0x71, 0x2c, 0xcb, 0x96, - 0xca, 0x97, 0x70, 0x2d, 0xa3, 0xfe, 0x19, 0x44, 0xce, 0x93, - 0x74, 0x29, 0xa7, 0xfa, 0x1d, 0x40, 0x1c, 0x41, 0xa6, 0xfb, - 0x75, 0x28, 0xcf, 0x92, 0x77, 0x2a, 0xcd, 0x90, 0x1e, 0x43, - 0xa4, 0xf9, 0xa5, 0xf8, 0x1f, 0x42, 0xcc, 0x91, 0x76, 0x2b, - 0x7f, 0x22, 0xc5, 0x98, 0x16, 0x4b, 0xac, 0xf1, 0xad, 0xf0, - 0x17, 0x4a, 0xc4, 0x99, 0x7e, 0x23, 0xc6, 0x9b, 0x7c, 0x21, - 0xaf, 0xf2, 0x15, 0x48, 0x14, 0x49, 0xae, 0xf3, 0x7d, 0x20, - 0xc7, 0x9a, 0x10, 0x4d, 0xaa, 0xf7, 0x79, 0x24, 0xc3, 0x9e, - 0xc2, 0x9f, 0x78, 0x25, 0xab, 0xf6, 0x11, 0x4c, 0xa9, 0xf4, - 0x13, 0x4e, 0xc0, 0x9d, 0x7a, 0x27, 0x7b, 0x26, 0xc1, 0x9c, - 0x12, 0x4f, 0xa8, 0xf5, 0x00, 0x5e, 0xbc, 0xe2, 0x65, 0x3b, - 0xd9, 0x87, 0xca, 0x94, 0x76, 0x28, 0xaf, 0xf1, 0x13, 0x4d, - 0x89, 0xd7, 0x35, 0x6b, 0xec, 0xb2, 0x50, 0x0e, 0x43, 0x1d, - 0xff, 0xa1, 0x26, 0x78, 0x9a, 0xc4, 0x0f, 0x51, 0xb3, 0xed, - 0x6a, 0x34, 0xd6, 0x88, 0xc5, 0x9b, 0x79, 0x27, 0xa0, 0xfe, - 0x1c, 0x42, 0x86, 0xd8, 0x3a, 0x64, 0xe3, 0xbd, 0x5f, 0x01, - 0x4c, 0x12, 0xf0, 0xae, 0x29, 0x77, 0x95, 0xcb, 0x1e, 0x40, - 0xa2, 0xfc, 0x7b, 0x25, 0xc7, 0x99, 0xd4, 0x8a, 0x68, 0x36, - 0xb1, 0xef, 0x0d, 0x53, 0x97, 0xc9, 0x2b, 0x75, 0xf2, 0xac, - 0x4e, 0x10, 0x5d, 0x03, 0xe1, 0xbf, 0x38, 0x66, 0x84, 0xda, - 0x11, 0x4f, 0xad, 0xf3, 0x74, 0x2a, 0xc8, 0x96, 0xdb, 0x85, - 0x67, 0x39, 0xbe, 0xe0, 0x02, 0x5c, 0x98, 0xc6, 0x24, 0x7a, - 0xfd, 0xa3, 0x41, 0x1f, 0x52, 0x0c, 0xee, 0xb0, 0x37, 0x69, - 0x8b, 0xd5, 0x3c, 0x62, 0x80, 0xde, 0x59, 0x07, 0xe5, 0xbb, - 0xf6, 0xa8, 0x4a, 0x14, 0x93, 0xcd, 0x2f, 0x71, 0xb5, 0xeb, - 0x09, 0x57, 0xd0, 0x8e, 0x6c, 0x32, 0x7f, 0x21, 0xc3, 0x9d, - 0x1a, 0x44, 0xa6, 0xf8, 0x33, 0x6d, 0x8f, 0xd1, 0x56, 0x08, - 0xea, 0xb4, 0xf9, 0xa7, 0x45, 0x1b, 0x9c, 0xc2, 0x20, 0x7e, - 0xba, 0xe4, 0x06, 0x58, 0xdf, 0x81, 0x63, 0x3d, 0x70, 0x2e, - 0xcc, 0x92, 0x15, 0x4b, 0xa9, 0xf7, 0x22, 0x7c, 0x9e, 0xc0, - 0x47, 0x19, 0xfb, 0xa5, 0xe8, 0xb6, 0x54, 0x0a, 0x8d, 0xd3, - 0x31, 0x6f, 0xab, 0xf5, 0x17, 0x49, 0xce, 0x90, 0x72, 0x2c, - 0x61, 0x3f, 0xdd, 0x83, 0x04, 0x5a, 0xb8, 0xe6, 0x2d, 0x73, - 0x91, 0xcf, 0x48, 0x16, 0xf4, 0xaa, 0xe7, 0xb9, 0x5b, 0x05, - 0x82, 0xdc, 0x3e, 0x60, 0xa4, 0xfa, 0x18, 0x46, 0xc1, 0x9f, - 0x7d, 0x23, 0x6e, 0x30, 0xd2, 0x8c, 0x0b, 0x55, 0xb7, 0xe9, - 0x00, 0x5f, 0xbe, 0xe1, 0x61, 0x3e, 0xdf, 0x80, 0xc2, 0x9d, - 0x7c, 0x23, 0xa3, 0xfc, 0x1d, 0x42, 0x99, 0xc6, 0x27, 0x78, - 0xf8, 0xa7, 0x46, 0x19, 0x5b, 0x04, 0xe5, 0xba, 0x3a, 0x65, - 0x84, 0xdb, 0x2f, 0x70, 0x91, 0xce, 0x4e, 0x11, 0xf0, 0xaf, - 0xed, 0xb2, 0x53, 0x0c, 0x8c, 0xd3, 0x32, 0x6d, 0xb6, 0xe9, - 0x08, 0x57, 0xd7, 0x88, 0x69, 0x36, 0x74, 0x2b, 0xca, 0x95, - 0x15, 0x4a, 0xab, 0xf4, 0x5e, 0x01, 0xe0, 0xbf, 0x3f, 0x60, - 0x81, 0xde, 0x9c, 0xc3, 0x22, 0x7d, 0xfd, 0xa2, 0x43, 0x1c, - 0xc7, 0x98, 0x79, 0x26, 0xa6, 0xf9, 0x18, 0x47, 0x05, 0x5a, - 0xbb, 0xe4, 0x64, 0x3b, 0xda, 0x85, 0x71, 0x2e, 0xcf, 0x90, - 0x10, 0x4f, 0xae, 0xf1, 0xb3, 0xec, 0x0d, 0x52, 0xd2, 0x8d, - 0x6c, 0x33, 0xe8, 0xb7, 0x56, 0x09, 0x89, 0xd6, 0x37, 0x68, - 0x2a, 0x75, 0x94, 0xcb, 0x4b, 0x14, 0xf5, 0xaa, 0xbc, 0xe3, - 0x02, 0x5d, 0xdd, 0x82, 0x63, 0x3c, 0x7e, 0x21, 0xc0, 0x9f, - 0x1f, 0x40, 0xa1, 0xfe, 0x25, 0x7a, 0x9b, 0xc4, 0x44, 0x1b, - 0xfa, 0xa5, 0xe7, 0xb8, 0x59, 0x06, 0x86, 0xd9, 0x38, 0x67, - 0x93, 0xcc, 0x2d, 0x72, 0xf2, 0xad, 0x4c, 0x13, 0x51, 0x0e, - 0xef, 0xb0, 0x30, 0x6f, 0x8e, 0xd1, 0x0a, 0x55, 0xb4, 0xeb, - 0x6b, 0x34, 0xd5, 0x8a, 0xc8, 0x97, 0x76, 0x29, 0xa9, 0xf6, - 0x17, 0x48, 0xe2, 0xbd, 0x5c, 0x03, 0x83, 0xdc, 0x3d, 0x62, - 0x20, 0x7f, 0x9e, 0xc1, 0x41, 0x1e, 0xff, 0xa0, 0x7b, 0x24, - 0xc5, 0x9a, 0x1a, 0x45, 0xa4, 0xfb, 0xb9, 0xe6, 0x07, 0x58, - 0xd8, 0x87, 0x66, 0x39, 0xcd, 0x92, 0x73, 0x2c, 0xac, 0xf3, - 0x12, 0x4d, 0x0f, 0x50, 0xb1, 0xee, 0x6e, 0x31, 0xd0, 0x8f, - 0x54, 0x0b, 0xea, 0xb5, 0x35, 0x6a, 0x8b, 0xd4, 0x96, 0xc9, - 0x28, 0x77, 0xf7, 0xa8, 0x49, 0x16, 0x00, 0x60, 0xc0, 0xa0, - 0x9d, 0xfd, 0x5d, 0x3d, 0x27, 0x47, 0xe7, 0x87, 0xba, 0xda, - 0x7a, 0x1a, 0x4e, 0x2e, 0x8e, 0xee, 0xd3, 0xb3, 0x13, 0x73, - 0x69, 0x09, 0xa9, 0xc9, 0xf4, 0x94, 0x34, 0x54, 0x9c, 0xfc, - 0x5c, 0x3c, 0x01, 0x61, 0xc1, 0xa1, 0xbb, 0xdb, 0x7b, 0x1b, - 0x26, 0x46, 0xe6, 0x86, 0xd2, 0xb2, 0x12, 0x72, 0x4f, 0x2f, - 0x8f, 0xef, 0xf5, 0x95, 0x35, 0x55, 0x68, 0x08, 0xa8, 0xc8, - 0x25, 0x45, 0xe5, 0x85, 0xb8, 0xd8, 0x78, 0x18, 0x02, 0x62, - 0xc2, 0xa2, 0x9f, 0xff, 0x5f, 0x3f, 0x6b, 0x0b, 0xab, 0xcb, - 0xf6, 0x96, 0x36, 0x56, 0x4c, 0x2c, 0x8c, 0xec, 0xd1, 0xb1, - 0x11, 0x71, 0xb9, 0xd9, 0x79, 0x19, 0x24, 0x44, 0xe4, 0x84, - 0x9e, 0xfe, 0x5e, 0x3e, 0x03, 0x63, 0xc3, 0xa3, 0xf7, 0x97, - 0x37, 0x57, 0x6a, 0x0a, 0xaa, 0xca, 0xd0, 0xb0, 0x10, 0x70, - 0x4d, 0x2d, 0x8d, 0xed, 0x4a, 0x2a, 0x8a, 0xea, 0xd7, 0xb7, - 0x17, 0x77, 0x6d, 0x0d, 0xad, 0xcd, 0xf0, 0x90, 0x30, 0x50, - 0x04, 0x64, 0xc4, 0xa4, 0x99, 0xf9, 0x59, 0x39, 0x23, 0x43, - 0xe3, 0x83, 0xbe, 0xde, 0x7e, 0x1e, 0xd6, 0xb6, 0x16, 0x76, - 0x4b, 0x2b, 0x8b, 0xeb, 0xf1, 0x91, 0x31, 0x51, 0x6c, 0x0c, - 0xac, 0xcc, 0x98, 0xf8, 0x58, 0x38, 0x05, 0x65, 0xc5, 0xa5, - 0xbf, 0xdf, 0x7f, 0x1f, 0x22, 0x42, 0xe2, 0x82, 0x6f, 0x0f, - 0xaf, 0xcf, 0xf2, 0x92, 0x32, 0x52, 0x48, 0x28, 0x88, 0xe8, - 0xd5, 0xb5, 0x15, 0x75, 0x21, 0x41, 0xe1, 0x81, 0xbc, 0xdc, - 0x7c, 0x1c, 0x06, 0x66, 0xc6, 0xa6, 0x9b, 0xfb, 0x5b, 0x3b, - 0xf3, 0x93, 0x33, 0x53, 0x6e, 0x0e, 0xae, 0xce, 0xd4, 0xb4, - 0x14, 0x74, 0x49, 0x29, 0x89, 0xe9, 0xbd, 0xdd, 0x7d, 0x1d, - 0x20, 0x40, 0xe0, 0x80, 0x9a, 0xfa, 0x5a, 0x3a, 0x07, 0x67, - 0xc7, 0xa7, 0x00, 0x61, 0xc2, 0xa3, 0x99, 0xf8, 0x5b, 0x3a, - 0x2f, 0x4e, 0xed, 0x8c, 0xb6, 0xd7, 0x74, 0x15, 0x5e, 0x3f, - 0x9c, 0xfd, 0xc7, 0xa6, 0x05, 0x64, 0x71, 0x10, 0xb3, 0xd2, - 0xe8, 0x89, 0x2a, 0x4b, 0xbc, 0xdd, 0x7e, 0x1f, 0x25, 0x44, - 0xe7, 0x86, 0x93, 0xf2, 0x51, 0x30, 0x0a, 0x6b, 0xc8, 0xa9, - 0xe2, 0x83, 0x20, 0x41, 0x7b, 0x1a, 0xb9, 0xd8, 0xcd, 0xac, - 0x0f, 0x6e, 0x54, 0x35, 0x96, 0xf7, 0x65, 0x04, 0xa7, 0xc6, - 0xfc, 0x9d, 0x3e, 0x5f, 0x4a, 0x2b, 0x88, 0xe9, 0xd3, 0xb2, - 0x11, 0x70, 0x3b, 0x5a, 0xf9, 0x98, 0xa2, 0xc3, 0x60, 0x01, - 0x14, 0x75, 0xd6, 0xb7, 0x8d, 0xec, 0x4f, 0x2e, 0xd9, 0xb8, - 0x1b, 0x7a, 0x40, 0x21, 0x82, 0xe3, 0xf6, 0x97, 0x34, 0x55, - 0x6f, 0x0e, 0xad, 0xcc, 0x87, 0xe6, 0x45, 0x24, 0x1e, 0x7f, - 0xdc, 0xbd, 0xa8, 0xc9, 0x6a, 0x0b, 0x31, 0x50, 0xf3, 0x92, - 0xca, 0xab, 0x08, 0x69, 0x53, 0x32, 0x91, 0xf0, 0xe5, 0x84, - 0x27, 0x46, 0x7c, 0x1d, 0xbe, 0xdf, 0x94, 0xf5, 0x56, 0x37, - 0x0d, 0x6c, 0xcf, 0xae, 0xbb, 0xda, 0x79, 0x18, 0x22, 0x43, - 0xe0, 0x81, 0x76, 0x17, 0xb4, 0xd5, 0xef, 0x8e, 0x2d, 0x4c, - 0x59, 0x38, 0x9b, 0xfa, 0xc0, 0xa1, 0x02, 0x63, 0x28, 0x49, - 0xea, 0x8b, 0xb1, 0xd0, 0x73, 0x12, 0x07, 0x66, 0xc5, 0xa4, - 0x9e, 0xff, 0x5c, 0x3d, 0xaf, 0xce, 0x6d, 0x0c, 0x36, 0x57, - 0xf4, 0x95, 0x80, 0xe1, 0x42, 0x23, 0x19, 0x78, 0xdb, 0xba, - 0xf1, 0x90, 0x33, 0x52, 0x68, 0x09, 0xaa, 0xcb, 0xde, 0xbf, - 0x1c, 0x7d, 0x47, 0x26, 0x85, 0xe4, 0x13, 0x72, 0xd1, 0xb0, - 0x8a, 0xeb, 0x48, 0x29, 0x3c, 0x5d, 0xfe, 0x9f, 0xa5, 0xc4, - 0x67, 0x06, 0x4d, 0x2c, 0x8f, 0xee, 0xd4, 0xb5, 0x16, 0x77, - 0x62, 0x03, 0xa0, 0xc1, 0xfb, 0x9a, 0x39, 0x58, 0x00, 0x62, - 0xc4, 0xa6, 0x95, 0xf7, 0x51, 0x33, 0x37, 0x55, 0xf3, 0x91, - 0xa2, 0xc0, 0x66, 0x04, 0x6e, 0x0c, 0xaa, 0xc8, 0xfb, 0x99, - 0x3f, 0x5d, 0x59, 0x3b, 0x9d, 0xff, 0xcc, 0xae, 0x08, 0x6a, - 0xdc, 0xbe, 0x18, 0x7a, 0x49, 0x2b, 0x8d, 0xef, 0xeb, 0x89, - 0x2f, 0x4d, 0x7e, 0x1c, 0xba, 0xd8, 0xb2, 0xd0, 0x76, 0x14, - 0x27, 0x45, 0xe3, 0x81, 0x85, 0xe7, 0x41, 0x23, 0x10, 0x72, - 0xd4, 0xb6, 0xa5, 0xc7, 0x61, 0x03, 0x30, 0x52, 0xf4, 0x96, - 0x92, 0xf0, 0x56, 0x34, 0x07, 0x65, 0xc3, 0xa1, 0xcb, 0xa9, - 0x0f, 0x6d, 0x5e, 0x3c, 0x9a, 0xf8, 0xfc, 0x9e, 0x38, 0x5a, - 0x69, 0x0b, 0xad, 0xcf, 0x79, 0x1b, 0xbd, 0xdf, 0xec, 0x8e, - 0x28, 0x4a, 0x4e, 0x2c, 0x8a, 0xe8, 0xdb, 0xb9, 0x1f, 0x7d, - 0x17, 0x75, 0xd3, 0xb1, 0x82, 0xe0, 0x46, 0x24, 0x20, 0x42, - 0xe4, 0x86, 0xb5, 0xd7, 0x71, 0x13, 0x57, 0x35, 0x93, 0xf1, - 0xc2, 0xa0, 0x06, 0x64, 0x60, 0x02, 0xa4, 0xc6, 0xf5, 0x97, - 0x31, 0x53, 0x39, 0x5b, 0xfd, 0x9f, 0xac, 0xce, 0x68, 0x0a, - 0x0e, 0x6c, 0xca, 0xa8, 0x9b, 0xf9, 0x5f, 0x3d, 0x8b, 0xe9, - 0x4f, 0x2d, 0x1e, 0x7c, 0xda, 0xb8, 0xbc, 0xde, 0x78, 0x1a, - 0x29, 0x4b, 0xed, 0x8f, 0xe5, 0x87, 0x21, 0x43, 0x70, 0x12, - 0xb4, 0xd6, 0xd2, 0xb0, 0x16, 0x74, 0x47, 0x25, 0x83, 0xe1, - 0xf2, 0x90, 0x36, 0x54, 0x67, 0x05, 0xa3, 0xc1, 0xc5, 0xa7, - 0x01, 0x63, 0x50, 0x32, 0x94, 0xf6, 0x9c, 0xfe, 0x58, 0x3a, - 0x09, 0x6b, 0xcd, 0xaf, 0xab, 0xc9, 0x6f, 0x0d, 0x3e, 0x5c, - 0xfa, 0x98, 0x2e, 0x4c, 0xea, 0x88, 0xbb, 0xd9, 0x7f, 0x1d, - 0x19, 0x7b, 0xdd, 0xbf, 0x8c, 0xee, 0x48, 0x2a, 0x40, 0x22, - 0x84, 0xe6, 0xd5, 0xb7, 0x11, 0x73, 0x77, 0x15, 0xb3, 0xd1, - 0xe2, 0x80, 0x26, 0x44, 0x00, 0x63, 0xc6, 0xa5, 0x91, 0xf2, - 0x57, 0x34, 0x3f, 0x5c, 0xf9, 0x9a, 0xae, 0xcd, 0x68, 0x0b, - 0x7e, 0x1d, 0xb8, 0xdb, 0xef, 0x8c, 0x29, 0x4a, 0x41, 0x22, - 0x87, 0xe4, 0xd0, 0xb3, 0x16, 0x75, 0xfc, 0x9f, 0x3a, 0x59, - 0x6d, 0x0e, 0xab, 0xc8, 0xc3, 0xa0, 0x05, 0x66, 0x52, 0x31, - 0x94, 0xf7, 0x82, 0xe1, 0x44, 0x27, 0x13, 0x70, 0xd5, 0xb6, - 0xbd, 0xde, 0x7b, 0x18, 0x2c, 0x4f, 0xea, 0x89, 0xe5, 0x86, - 0x23, 0x40, 0x74, 0x17, 0xb2, 0xd1, 0xda, 0xb9, 0x1c, 0x7f, - 0x4b, 0x28, 0x8d, 0xee, 0x9b, 0xf8, 0x5d, 0x3e, 0x0a, 0x69, - 0xcc, 0xaf, 0xa4, 0xc7, 0x62, 0x01, 0x35, 0x56, 0xf3, 0x90, - 0x19, 0x7a, 0xdf, 0xbc, 0x88, 0xeb, 0x4e, 0x2d, 0x26, 0x45, - 0xe0, 0x83, 0xb7, 0xd4, 0x71, 0x12, 0x67, 0x04, 0xa1, 0xc2, - 0xf6, 0x95, 0x30, 0x53, 0x58, 0x3b, 0x9e, 0xfd, 0xc9, 0xaa, - 0x0f, 0x6c, 0xd7, 0xb4, 0x11, 0x72, 0x46, 0x25, 0x80, 0xe3, - 0xe8, 0x8b, 0x2e, 0x4d, 0x79, 0x1a, 0xbf, 0xdc, 0xa9, 0xca, - 0x6f, 0x0c, 0x38, 0x5b, 0xfe, 0x9d, 0x96, 0xf5, 0x50, 0x33, - 0x07, 0x64, 0xc1, 0xa2, 0x2b, 0x48, 0xed, 0x8e, 0xba, 0xd9, - 0x7c, 0x1f, 0x14, 0x77, 0xd2, 0xb1, 0x85, 0xe6, 0x43, 0x20, - 0x55, 0x36, 0x93, 0xf0, 0xc4, 0xa7, 0x02, 0x61, 0x6a, 0x09, - 0xac, 0xcf, 0xfb, 0x98, 0x3d, 0x5e, 0x32, 0x51, 0xf4, 0x97, - 0xa3, 0xc0, 0x65, 0x06, 0x0d, 0x6e, 0xcb, 0xa8, 0x9c, 0xff, - 0x5a, 0x39, 0x4c, 0x2f, 0x8a, 0xe9, 0xdd, 0xbe, 0x1b, 0x78, - 0x73, 0x10, 0xb5, 0xd6, 0xe2, 0x81, 0x24, 0x47, 0xce, 0xad, - 0x08, 0x6b, 0x5f, 0x3c, 0x99, 0xfa, 0xf1, 0x92, 0x37, 0x54, - 0x60, 0x03, 0xa6, 0xc5, 0xb0, 0xd3, 0x76, 0x15, 0x21, 0x42, - 0xe7, 0x84, 0x8f, 0xec, 0x49, 0x2a, 0x1e, 0x7d, 0xd8, 0xbb, - 0x00, 0x64, 0xc8, 0xac, 0x8d, 0xe9, 0x45, 0x21, 0x07, 0x63, - 0xcf, 0xab, 0x8a, 0xee, 0x42, 0x26, 0x0e, 0x6a, 0xc6, 0xa2, - 0x83, 0xe7, 0x4b, 0x2f, 0x09, 0x6d, 0xc1, 0xa5, 0x84, 0xe0, - 0x4c, 0x28, 0x1c, 0x78, 0xd4, 0xb0, 0x91, 0xf5, 0x59, 0x3d, - 0x1b, 0x7f, 0xd3, 0xb7, 0x96, 0xf2, 0x5e, 0x3a, 0x12, 0x76, - 0xda, 0xbe, 0x9f, 0xfb, 0x57, 0x33, 0x15, 0x71, 0xdd, 0xb9, - 0x98, 0xfc, 0x50, 0x34, 0x38, 0x5c, 0xf0, 0x94, 0xb5, 0xd1, - 0x7d, 0x19, 0x3f, 0x5b, 0xf7, 0x93, 0xb2, 0xd6, 0x7a, 0x1e, - 0x36, 0x52, 0xfe, 0x9a, 0xbb, 0xdf, 0x73, 0x17, 0x31, 0x55, - 0xf9, 0x9d, 0xbc, 0xd8, 0x74, 0x10, 0x24, 0x40, 0xec, 0x88, - 0xa9, 0xcd, 0x61, 0x05, 0x23, 0x47, 0xeb, 0x8f, 0xae, 0xca, - 0x66, 0x02, 0x2a, 0x4e, 0xe2, 0x86, 0xa7, 0xc3, 0x6f, 0x0b, - 0x2d, 0x49, 0xe5, 0x81, 0xa0, 0xc4, 0x68, 0x0c, 0x70, 0x14, - 0xb8, 0xdc, 0xfd, 0x99, 0x35, 0x51, 0x77, 0x13, 0xbf, 0xdb, - 0xfa, 0x9e, 0x32, 0x56, 0x7e, 0x1a, 0xb6, 0xd2, 0xf3, 0x97, - 0x3b, 0x5f, 0x79, 0x1d, 0xb1, 0xd5, 0xf4, 0x90, 0x3c, 0x58, - 0x6c, 0x08, 0xa4, 0xc0, 0xe1, 0x85, 0x29, 0x4d, 0x6b, 0x0f, - 0xa3, 0xc7, 0xe6, 0x82, 0x2e, 0x4a, 0x62, 0x06, 0xaa, 0xce, - 0xef, 0x8b, 0x27, 0x43, 0x65, 0x01, 0xad, 0xc9, 0xe8, 0x8c, - 0x20, 0x44, 0x48, 0x2c, 0x80, 0xe4, 0xc5, 0xa1, 0x0d, 0x69, - 0x4f, 0x2b, 0x87, 0xe3, 0xc2, 0xa6, 0x0a, 0x6e, 0x46, 0x22, - 0x8e, 0xea, 0xcb, 0xaf, 0x03, 0x67, 0x41, 0x25, 0x89, 0xed, - 0xcc, 0xa8, 0x04, 0x60, 0x54, 0x30, 0x9c, 0xf8, 0xd9, 0xbd, - 0x11, 0x75, 0x53, 0x37, 0x9b, 0xff, 0xde, 0xba, 0x16, 0x72, - 0x5a, 0x3e, 0x92, 0xf6, 0xd7, 0xb3, 0x1f, 0x7b, 0x5d, 0x39, - 0x95, 0xf1, 0xd0, 0xb4, 0x18, 0x7c, 0x00, 0x65, 0xca, 0xaf, - 0x89, 0xec, 0x43, 0x26, 0x0f, 0x6a, 0xc5, 0xa0, 0x86, 0xe3, - 0x4c, 0x29, 0x1e, 0x7b, 0xd4, 0xb1, 0x97, 0xf2, 0x5d, 0x38, - 0x11, 0x74, 0xdb, 0xbe, 0x98, 0xfd, 0x52, 0x37, 0x3c, 0x59, - 0xf6, 0x93, 0xb5, 0xd0, 0x7f, 0x1a, 0x33, 0x56, 0xf9, 0x9c, - 0xba, 0xdf, 0x70, 0x15, 0x22, 0x47, 0xe8, 0x8d, 0xab, 0xce, - 0x61, 0x04, 0x2d, 0x48, 0xe7, 0x82, 0xa4, 0xc1, 0x6e, 0x0b, - 0x78, 0x1d, 0xb2, 0xd7, 0xf1, 0x94, 0x3b, 0x5e, 0x77, 0x12, - 0xbd, 0xd8, 0xfe, 0x9b, 0x34, 0x51, 0x66, 0x03, 0xac, 0xc9, - 0xef, 0x8a, 0x25, 0x40, 0x69, 0x0c, 0xa3, 0xc6, 0xe0, 0x85, - 0x2a, 0x4f, 0x44, 0x21, 0x8e, 0xeb, 0xcd, 0xa8, 0x07, 0x62, - 0x4b, 0x2e, 0x81, 0xe4, 0xc2, 0xa7, 0x08, 0x6d, 0x5a, 0x3f, - 0x90, 0xf5, 0xd3, 0xb6, 0x19, 0x7c, 0x55, 0x30, 0x9f, 0xfa, - 0xdc, 0xb9, 0x16, 0x73, 0xf0, 0x95, 0x3a, 0x5f, 0x79, 0x1c, - 0xb3, 0xd6, 0xff, 0x9a, 0x35, 0x50, 0x76, 0x13, 0xbc, 0xd9, - 0xee, 0x8b, 0x24, 0x41, 0x67, 0x02, 0xad, 0xc8, 0xe1, 0x84, - 0x2b, 0x4e, 0x68, 0x0d, 0xa2, 0xc7, 0xcc, 0xa9, 0x06, 0x63, - 0x45, 0x20, 0x8f, 0xea, 0xc3, 0xa6, 0x09, 0x6c, 0x4a, 0x2f, - 0x80, 0xe5, 0xd2, 0xb7, 0x18, 0x7d, 0x5b, 0x3e, 0x91, 0xf4, - 0xdd, 0xb8, 0x17, 0x72, 0x54, 0x31, 0x9e, 0xfb, 0x88, 0xed, - 0x42, 0x27, 0x01, 0x64, 0xcb, 0xae, 0x87, 0xe2, 0x4d, 0x28, - 0x0e, 0x6b, 0xc4, 0xa1, 0x96, 0xf3, 0x5c, 0x39, 0x1f, 0x7a, - 0xd5, 0xb0, 0x99, 0xfc, 0x53, 0x36, 0x10, 0x75, 0xda, 0xbf, - 0xb4, 0xd1, 0x7e, 0x1b, 0x3d, 0x58, 0xf7, 0x92, 0xbb, 0xde, - 0x71, 0x14, 0x32, 0x57, 0xf8, 0x9d, 0xaa, 0xcf, 0x60, 0x05, - 0x23, 0x46, 0xe9, 0x8c, 0xa5, 0xc0, 0x6f, 0x0a, 0x2c, 0x49, - 0xe6, 0x83, 0x00, 0x66, 0xcc, 0xaa, 0x85, 0xe3, 0x49, 0x2f, - 0x17, 0x71, 0xdb, 0xbd, 0x92, 0xf4, 0x5e, 0x38, 0x2e, 0x48, - 0xe2, 0x84, 0xab, 0xcd, 0x67, 0x01, 0x39, 0x5f, 0xf5, 0x93, - 0xbc, 0xda, 0x70, 0x16, 0x5c, 0x3a, 0x90, 0xf6, 0xd9, 0xbf, - 0x15, 0x73, 0x4b, 0x2d, 0x87, 0xe1, 0xce, 0xa8, 0x02, 0x64, - 0x72, 0x14, 0xbe, 0xd8, 0xf7, 0x91, 0x3b, 0x5d, 0x65, 0x03, - 0xa9, 0xcf, 0xe0, 0x86, 0x2c, 0x4a, 0xb8, 0xde, 0x74, 0x12, - 0x3d, 0x5b, 0xf1, 0x97, 0xaf, 0xc9, 0x63, 0x05, 0x2a, 0x4c, - 0xe6, 0x80, 0x96, 0xf0, 0x5a, 0x3c, 0x13, 0x75, 0xdf, 0xb9, - 0x81, 0xe7, 0x4d, 0x2b, 0x04, 0x62, 0xc8, 0xae, 0xe4, 0x82, - 0x28, 0x4e, 0x61, 0x07, 0xad, 0xcb, 0xf3, 0x95, 0x3f, 0x59, - 0x76, 0x10, 0xba, 0xdc, 0xca, 0xac, 0x06, 0x60, 0x4f, 0x29, - 0x83, 0xe5, 0xdd, 0xbb, 0x11, 0x77, 0x58, 0x3e, 0x94, 0xf2, - 0x6d, 0x0b, 0xa1, 0xc7, 0xe8, 0x8e, 0x24, 0x42, 0x7a, 0x1c, - 0xb6, 0xd0, 0xff, 0x99, 0x33, 0x55, 0x43, 0x25, 0x8f, 0xe9, - 0xc6, 0xa0, 0x0a, 0x6c, 0x54, 0x32, 0x98, 0xfe, 0xd1, 0xb7, - 0x1d, 0x7b, 0x31, 0x57, 0xfd, 0x9b, 0xb4, 0xd2, 0x78, 0x1e, - 0x26, 0x40, 0xea, 0x8c, 0xa3, 0xc5, 0x6f, 0x09, 0x1f, 0x79, - 0xd3, 0xb5, 0x9a, 0xfc, 0x56, 0x30, 0x08, 0x6e, 0xc4, 0xa2, - 0x8d, 0xeb, 0x41, 0x27, 0xd5, 0xb3, 0x19, 0x7f, 0x50, 0x36, - 0x9c, 0xfa, 0xc2, 0xa4, 0x0e, 0x68, 0x47, 0x21, 0x8b, 0xed, - 0xfb, 0x9d, 0x37, 0x51, 0x7e, 0x18, 0xb2, 0xd4, 0xec, 0x8a, - 0x20, 0x46, 0x69, 0x0f, 0xa5, 0xc3, 0x89, 0xef, 0x45, 0x23, - 0x0c, 0x6a, 0xc0, 0xa6, 0x9e, 0xf8, 0x52, 0x34, 0x1b, 0x7d, - 0xd7, 0xb1, 0xa7, 0xc1, 0x6b, 0x0d, 0x22, 0x44, 0xee, 0x88, - 0xb0, 0xd6, 0x7c, 0x1a, 0x35, 0x53, 0xf9, 0x9f, 0x00, 0x67, - 0xce, 0xa9, 0x81, 0xe6, 0x4f, 0x28, 0x1f, 0x78, 0xd1, 0xb6, - 0x9e, 0xf9, 0x50, 0x37, 0x3e, 0x59, 0xf0, 0x97, 0xbf, 0xd8, - 0x71, 0x16, 0x21, 0x46, 0xef, 0x88, 0xa0, 0xc7, 0x6e, 0x09, - 0x7c, 0x1b, 0xb2, 0xd5, 0xfd, 0x9a, 0x33, 0x54, 0x63, 0x04, - 0xad, 0xca, 0xe2, 0x85, 0x2c, 0x4b, 0x42, 0x25, 0x8c, 0xeb, - 0xc3, 0xa4, 0x0d, 0x6a, 0x5d, 0x3a, 0x93, 0xf4, 0xdc, 0xbb, - 0x12, 0x75, 0xf8, 0x9f, 0x36, 0x51, 0x79, 0x1e, 0xb7, 0xd0, - 0xe7, 0x80, 0x29, 0x4e, 0x66, 0x01, 0xa8, 0xcf, 0xc6, 0xa1, - 0x08, 0x6f, 0x47, 0x20, 0x89, 0xee, 0xd9, 0xbe, 0x17, 0x70, - 0x58, 0x3f, 0x96, 0xf1, 0x84, 0xe3, 0x4a, 0x2d, 0x05, 0x62, - 0xcb, 0xac, 0x9b, 0xfc, 0x55, 0x32, 0x1a, 0x7d, 0xd4, 0xb3, - 0xba, 0xdd, 0x74, 0x13, 0x3b, 0x5c, 0xf5, 0x92, 0xa5, 0xc2, - 0x6b, 0x0c, 0x24, 0x43, 0xea, 0x8d, 0xed, 0x8a, 0x23, 0x44, - 0x6c, 0x0b, 0xa2, 0xc5, 0xf2, 0x95, 0x3c, 0x5b, 0x73, 0x14, - 0xbd, 0xda, 0xd3, 0xb4, 0x1d, 0x7a, 0x52, 0x35, 0x9c, 0xfb, - 0xcc, 0xab, 0x02, 0x65, 0x4d, 0x2a, 0x83, 0xe4, 0x91, 0xf6, - 0x5f, 0x38, 0x10, 0x77, 0xde, 0xb9, 0x8e, 0xe9, 0x40, 0x27, - 0x0f, 0x68, 0xc1, 0xa6, 0xaf, 0xc8, 0x61, 0x06, 0x2e, 0x49, - 0xe0, 0x87, 0xb0, 0xd7, 0x7e, 0x19, 0x31, 0x56, 0xff, 0x98, - 0x15, 0x72, 0xdb, 0xbc, 0x94, 0xf3, 0x5a, 0x3d, 0x0a, 0x6d, - 0xc4, 0xa3, 0x8b, 0xec, 0x45, 0x22, 0x2b, 0x4c, 0xe5, 0x82, - 0xaa, 0xcd, 0x64, 0x03, 0x34, 0x53, 0xfa, 0x9d, 0xb5, 0xd2, - 0x7b, 0x1c, 0x69, 0x0e, 0xa7, 0xc0, 0xe8, 0x8f, 0x26, 0x41, - 0x76, 0x11, 0xb8, 0xdf, 0xf7, 0x90, 0x39, 0x5e, 0x57, 0x30, - 0x99, 0xfe, 0xd6, 0xb1, 0x18, 0x7f, 0x48, 0x2f, 0x86, 0xe1, - 0xc9, 0xae, 0x07, 0x60, 0x00, 0x68, 0xd0, 0xb8, 0xbd, 0xd5, - 0x6d, 0x05, 0x67, 0x0f, 0xb7, 0xdf, 0xda, 0xb2, 0x0a, 0x62, - 0xce, 0xa6, 0x1e, 0x76, 0x73, 0x1b, 0xa3, 0xcb, 0xa9, 0xc1, - 0x79, 0x11, 0x14, 0x7c, 0xc4, 0xac, 0x81, 0xe9, 0x51, 0x39, - 0x3c, 0x54, 0xec, 0x84, 0xe6, 0x8e, 0x36, 0x5e, 0x5b, 0x33, - 0x8b, 0xe3, 0x4f, 0x27, 0x9f, 0xf7, 0xf2, 0x9a, 0x22, 0x4a, - 0x28, 0x40, 0xf8, 0x90, 0x95, 0xfd, 0x45, 0x2d, 0x1f, 0x77, - 0xcf, 0xa7, 0xa2, 0xca, 0x72, 0x1a, 0x78, 0x10, 0xa8, 0xc0, - 0xc5, 0xad, 0x15, 0x7d, 0xd1, 0xb9, 0x01, 0x69, 0x6c, 0x04, - 0xbc, 0xd4, 0xb6, 0xde, 0x66, 0x0e, 0x0b, 0x63, 0xdb, 0xb3, - 0x9e, 0xf6, 0x4e, 0x26, 0x23, 0x4b, 0xf3, 0x9b, 0xf9, 0x91, - 0x29, 0x41, 0x44, 0x2c, 0x94, 0xfc, 0x50, 0x38, 0x80, 0xe8, - 0xed, 0x85, 0x3d, 0x55, 0x37, 0x5f, 0xe7, 0x8f, 0x8a, 0xe2, - 0x5a, 0x32, 0x3e, 0x56, 0xee, 0x86, 0x83, 0xeb, 0x53, 0x3b, - 0x59, 0x31, 0x89, 0xe1, 0xe4, 0x8c, 0x34, 0x5c, 0xf0, 0x98, - 0x20, 0x48, 0x4d, 0x25, 0x9d, 0xf5, 0x97, 0xff, 0x47, 0x2f, - 0x2a, 0x42, 0xfa, 0x92, 0xbf, 0xd7, 0x6f, 0x07, 0x02, 0x6a, - 0xd2, 0xba, 0xd8, 0xb0, 0x08, 0x60, 0x65, 0x0d, 0xb5, 0xdd, - 0x71, 0x19, 0xa1, 0xc9, 0xcc, 0xa4, 0x1c, 0x74, 0x16, 0x7e, - 0xc6, 0xae, 0xab, 0xc3, 0x7b, 0x13, 0x21, 0x49, 0xf1, 0x99, - 0x9c, 0xf4, 0x4c, 0x24, 0x46, 0x2e, 0x96, 0xfe, 0xfb, 0x93, - 0x2b, 0x43, 0xef, 0x87, 0x3f, 0x57, 0x52, 0x3a, 0x82, 0xea, - 0x88, 0xe0, 0x58, 0x30, 0x35, 0x5d, 0xe5, 0x8d, 0xa0, 0xc8, - 0x70, 0x18, 0x1d, 0x75, 0xcd, 0xa5, 0xc7, 0xaf, 0x17, 0x7f, - 0x7a, 0x12, 0xaa, 0xc2, 0x6e, 0x06, 0xbe, 0xd6, 0xd3, 0xbb, - 0x03, 0x6b, 0x09, 0x61, 0xd9, 0xb1, 0xb4, 0xdc, 0x64, 0x0c, - 0x00, 0x69, 0xd2, 0xbb, 0xb9, 0xd0, 0x6b, 0x02, 0x6f, 0x06, - 0xbd, 0xd4, 0xd6, 0xbf, 0x04, 0x6d, 0xde, 0xb7, 0x0c, 0x65, - 0x67, 0x0e, 0xb5, 0xdc, 0xb1, 0xd8, 0x63, 0x0a, 0x08, 0x61, - 0xda, 0xb3, 0xa1, 0xc8, 0x73, 0x1a, 0x18, 0x71, 0xca, 0xa3, - 0xce, 0xa7, 0x1c, 0x75, 0x77, 0x1e, 0xa5, 0xcc, 0x7f, 0x16, - 0xad, 0xc4, 0xc6, 0xaf, 0x14, 0x7d, 0x10, 0x79, 0xc2, 0xab, - 0xa9, 0xc0, 0x7b, 0x12, 0x5f, 0x36, 0x8d, 0xe4, 0xe6, 0x8f, - 0x34, 0x5d, 0x30, 0x59, 0xe2, 0x8b, 0x89, 0xe0, 0x5b, 0x32, - 0x81, 0xe8, 0x53, 0x3a, 0x38, 0x51, 0xea, 0x83, 0xee, 0x87, - 0x3c, 0x55, 0x57, 0x3e, 0x85, 0xec, 0xfe, 0x97, 0x2c, 0x45, - 0x47, 0x2e, 0x95, 0xfc, 0x91, 0xf8, 0x43, 0x2a, 0x28, 0x41, - 0xfa, 0x93, 0x20, 0x49, 0xf2, 0x9b, 0x99, 0xf0, 0x4b, 0x22, - 0x4f, 0x26, 0x9d, 0xf4, 0xf6, 0x9f, 0x24, 0x4d, 0xbe, 0xd7, - 0x6c, 0x05, 0x07, 0x6e, 0xd5, 0xbc, 0xd1, 0xb8, 0x03, 0x6a, - 0x68, 0x01, 0xba, 0xd3, 0x60, 0x09, 0xb2, 0xdb, 0xd9, 0xb0, - 0x0b, 0x62, 0x0f, 0x66, 0xdd, 0xb4, 0xb6, 0xdf, 0x64, 0x0d, - 0x1f, 0x76, 0xcd, 0xa4, 0xa6, 0xcf, 0x74, 0x1d, 0x70, 0x19, - 0xa2, 0xcb, 0xc9, 0xa0, 0x1b, 0x72, 0xc1, 0xa8, 0x13, 0x7a, - 0x78, 0x11, 0xaa, 0xc3, 0xae, 0xc7, 0x7c, 0x15, 0x17, 0x7e, - 0xc5, 0xac, 0xe1, 0x88, 0x33, 0x5a, 0x58, 0x31, 0x8a, 0xe3, - 0x8e, 0xe7, 0x5c, 0x35, 0x37, 0x5e, 0xe5, 0x8c, 0x3f, 0x56, - 0xed, 0x84, 0x86, 0xef, 0x54, 0x3d, 0x50, 0x39, 0x82, 0xeb, - 0xe9, 0x80, 0x3b, 0x52, 0x40, 0x29, 0x92, 0xfb, 0xf9, 0x90, - 0x2b, 0x42, 0x2f, 0x46, 0xfd, 0x94, 0x96, 0xff, 0x44, 0x2d, - 0x9e, 0xf7, 0x4c, 0x25, 0x27, 0x4e, 0xf5, 0x9c, 0xf1, 0x98, - 0x23, 0x4a, 0x48, 0x21, 0x9a, 0xf3, 0x00, 0x6a, 0xd4, 0xbe, - 0xb5, 0xdf, 0x61, 0x0b, 0x77, 0x1d, 0xa3, 0xc9, 0xc2, 0xa8, - 0x16, 0x7c, 0xee, 0x84, 0x3a, 0x50, 0x5b, 0x31, 0x8f, 0xe5, - 0x99, 0xf3, 0x4d, 0x27, 0x2c, 0x46, 0xf8, 0x92, 0xc1, 0xab, - 0x15, 0x7f, 0x74, 0x1e, 0xa0, 0xca, 0xb6, 0xdc, 0x62, 0x08, - 0x03, 0x69, 0xd7, 0xbd, 0x2f, 0x45, 0xfb, 0x91, 0x9a, 0xf0, - 0x4e, 0x24, 0x58, 0x32, 0x8c, 0xe6, 0xed, 0x87, 0x39, 0x53, - 0x9f, 0xf5, 0x4b, 0x21, 0x2a, 0x40, 0xfe, 0x94, 0xe8, 0x82, - 0x3c, 0x56, 0x5d, 0x37, 0x89, 0xe3, 0x71, 0x1b, 0xa5, 0xcf, - 0xc4, 0xae, 0x10, 0x7a, 0x06, 0x6c, 0xd2, 0xb8, 0xb3, 0xd9, - 0x67, 0x0d, 0x5e, 0x34, 0x8a, 0xe0, 0xeb, 0x81, 0x3f, 0x55, - 0x29, 0x43, 0xfd, 0x97, 0x9c, 0xf6, 0x48, 0x22, 0xb0, 0xda, - 0x64, 0x0e, 0x05, 0x6f, 0xd1, 0xbb, 0xc7, 0xad, 0x13, 0x79, - 0x72, 0x18, 0xa6, 0xcc, 0x23, 0x49, 0xf7, 0x9d, 0x96, 0xfc, - 0x42, 0x28, 0x54, 0x3e, 0x80, 0xea, 0xe1, 0x8b, 0x35, 0x5f, - 0xcd, 0xa7, 0x19, 0x73, 0x78, 0x12, 0xac, 0xc6, 0xba, 0xd0, - 0x6e, 0x04, 0x0f, 0x65, 0xdb, 0xb1, 0xe2, 0x88, 0x36, 0x5c, - 0x57, 0x3d, 0x83, 0xe9, 0x95, 0xff, 0x41, 0x2b, 0x20, 0x4a, - 0xf4, 0x9e, 0x0c, 0x66, 0xd8, 0xb2, 0xb9, 0xd3, 0x6d, 0x07, - 0x7b, 0x11, 0xaf, 0xc5, 0xce, 0xa4, 0x1a, 0x70, 0xbc, 0xd6, - 0x68, 0x02, 0x09, 0x63, 0xdd, 0xb7, 0xcb, 0xa1, 0x1f, 0x75, - 0x7e, 0x14, 0xaa, 0xc0, 0x52, 0x38, 0x86, 0xec, 0xe7, 0x8d, - 0x33, 0x59, 0x25, 0x4f, 0xf1, 0x9b, 0x90, 0xfa, 0x44, 0x2e, - 0x7d, 0x17, 0xa9, 0xc3, 0xc8, 0xa2, 0x1c, 0x76, 0x0a, 0x60, - 0xde, 0xb4, 0xbf, 0xd5, 0x6b, 0x01, 0x93, 0xf9, 0x47, 0x2d, - 0x26, 0x4c, 0xf2, 0x98, 0xe4, 0x8e, 0x30, 0x5a, 0x51, 0x3b, - 0x85, 0xef, 0x00, 0x6b, 0xd6, 0xbd, 0xb1, 0xda, 0x67, 0x0c, - 0x7f, 0x14, 0xa9, 0xc2, 0xce, 0xa5, 0x18, 0x73, 0xfe, 0x95, - 0x28, 0x43, 0x4f, 0x24, 0x99, 0xf2, 0x81, 0xea, 0x57, 0x3c, - 0x30, 0x5b, 0xe6, 0x8d, 0xe1, 0x8a, 0x37, 0x5c, 0x50, 0x3b, - 0x86, 0xed, 0x9e, 0xf5, 0x48, 0x23, 0x2f, 0x44, 0xf9, 0x92, - 0x1f, 0x74, 0xc9, 0xa2, 0xae, 0xc5, 0x78, 0x13, 0x60, 0x0b, - 0xb6, 0xdd, 0xd1, 0xba, 0x07, 0x6c, 0xdf, 0xb4, 0x09, 0x62, - 0x6e, 0x05, 0xb8, 0xd3, 0xa0, 0xcb, 0x76, 0x1d, 0x11, 0x7a, - 0xc7, 0xac, 0x21, 0x4a, 0xf7, 0x9c, 0x90, 0xfb, 0x46, 0x2d, - 0x5e, 0x35, 0x88, 0xe3, 0xef, 0x84, 0x39, 0x52, 0x3e, 0x55, - 0xe8, 0x83, 0x8f, 0xe4, 0x59, 0x32, 0x41, 0x2a, 0x97, 0xfc, - 0xf0, 0x9b, 0x26, 0x4d, 0xc0, 0xab, 0x16, 0x7d, 0x71, 0x1a, - 0xa7, 0xcc, 0xbf, 0xd4, 0x69, 0x02, 0x0e, 0x65, 0xd8, 0xb3, - 0xa3, 0xc8, 0x75, 0x1e, 0x12, 0x79, 0xc4, 0xaf, 0xdc, 0xb7, - 0x0a, 0x61, 0x6d, 0x06, 0xbb, 0xd0, 0x5d, 0x36, 0x8b, 0xe0, - 0xec, 0x87, 0x3a, 0x51, 0x22, 0x49, 0xf4, 0x9f, 0x93, 0xf8, - 0x45, 0x2e, 0x42, 0x29, 0x94, 0xff, 0xf3, 0x98, 0x25, 0x4e, - 0x3d, 0x56, 0xeb, 0x80, 0x8c, 0xe7, 0x5a, 0x31, 0xbc, 0xd7, - 0x6a, 0x01, 0x0d, 0x66, 0xdb, 0xb0, 0xc3, 0xa8, 0x15, 0x7e, - 0x72, 0x19, 0xa4, 0xcf, 0x7c, 0x17, 0xaa, 0xc1, 0xcd, 0xa6, - 0x1b, 0x70, 0x03, 0x68, 0xd5, 0xbe, 0xb2, 0xd9, 0x64, 0x0f, - 0x82, 0xe9, 0x54, 0x3f, 0x33, 0x58, 0xe5, 0x8e, 0xfd, 0x96, - 0x2b, 0x40, 0x4c, 0x27, 0x9a, 0xf1, 0x9d, 0xf6, 0x4b, 0x20, - 0x2c, 0x47, 0xfa, 0x91, 0xe2, 0x89, 0x34, 0x5f, 0x53, 0x38, - 0x85, 0xee, 0x63, 0x08, 0xb5, 0xde, 0xd2, 0xb9, 0x04, 0x6f, - 0x1c, 0x77, 0xca, 0xa1, 0xad, 0xc6, 0x7b, 0x10, 0x00, 0x6c, - 0xd8, 0xb4, 0xad, 0xc1, 0x75, 0x19, 0x47, 0x2b, 0x9f, 0xf3, - 0xea, 0x86, 0x32, 0x5e, 0x8e, 0xe2, 0x56, 0x3a, 0x23, 0x4f, - 0xfb, 0x97, 0xc9, 0xa5, 0x11, 0x7d, 0x64, 0x08, 0xbc, 0xd0, - 0x01, 0x6d, 0xd9, 0xb5, 0xac, 0xc0, 0x74, 0x18, 0x46, 0x2a, - 0x9e, 0xf2, 0xeb, 0x87, 0x33, 0x5f, 0x8f, 0xe3, 0x57, 0x3b, - 0x22, 0x4e, 0xfa, 0x96, 0xc8, 0xa4, 0x10, 0x7c, 0x65, 0x09, - 0xbd, 0xd1, 0x02, 0x6e, 0xda, 0xb6, 0xaf, 0xc3, 0x77, 0x1b, - 0x45, 0x29, 0x9d, 0xf1, 0xe8, 0x84, 0x30, 0x5c, 0x8c, 0xe0, - 0x54, 0x38, 0x21, 0x4d, 0xf9, 0x95, 0xcb, 0xa7, 0x13, 0x7f, - 0x66, 0x0a, 0xbe, 0xd2, 0x03, 0x6f, 0xdb, 0xb7, 0xae, 0xc2, - 0x76, 0x1a, 0x44, 0x28, 0x9c, 0xf0, 0xe9, 0x85, 0x31, 0x5d, - 0x8d, 0xe1, 0x55, 0x39, 0x20, 0x4c, 0xf8, 0x94, 0xca, 0xa6, - 0x12, 0x7e, 0x67, 0x0b, 0xbf, 0xd3, 0x04, 0x68, 0xdc, 0xb0, - 0xa9, 0xc5, 0x71, 0x1d, 0x43, 0x2f, 0x9b, 0xf7, 0xee, 0x82, - 0x36, 0x5a, 0x8a, 0xe6, 0x52, 0x3e, 0x27, 0x4b, 0xff, 0x93, - 0xcd, 0xa1, 0x15, 0x79, 0x60, 0x0c, 0xb8, 0xd4, 0x05, 0x69, - 0xdd, 0xb1, 0xa8, 0xc4, 0x70, 0x1c, 0x42, 0x2e, 0x9a, 0xf6, - 0xef, 0x83, 0x37, 0x5b, 0x8b, 0xe7, 0x53, 0x3f, 0x26, 0x4a, - 0xfe, 0x92, 0xcc, 0xa0, 0x14, 0x78, 0x61, 0x0d, 0xb9, 0xd5, - 0x06, 0x6a, 0xde, 0xb2, 0xab, 0xc7, 0x73, 0x1f, 0x41, 0x2d, - 0x99, 0xf5, 0xec, 0x80, 0x34, 0x58, 0x88, 0xe4, 0x50, 0x3c, - 0x25, 0x49, 0xfd, 0x91, 0xcf, 0xa3, 0x17, 0x7b, 0x62, 0x0e, - 0xba, 0xd6, 0x07, 0x6b, 0xdf, 0xb3, 0xaa, 0xc6, 0x72, 0x1e, - 0x40, 0x2c, 0x98, 0xf4, 0xed, 0x81, 0x35, 0x59, 0x89, 0xe5, - 0x51, 0x3d, 0x24, 0x48, 0xfc, 0x90, 0xce, 0xa2, 0x16, 0x7a, - 0x63, 0x0f, 0xbb, 0xd7, 0x00, 0x6d, 0xda, 0xb7, 0xa9, 0xc4, - 0x73, 0x1e, 0x4f, 0x22, 0x95, 0xf8, 0xe6, 0x8b, 0x3c, 0x51, - 0x9e, 0xf3, 0x44, 0x29, 0x37, 0x5a, 0xed, 0x80, 0xd1, 0xbc, - 0x0b, 0x66, 0x78, 0x15, 0xa2, 0xcf, 0x21, 0x4c, 0xfb, 0x96, - 0x88, 0xe5, 0x52, 0x3f, 0x6e, 0x03, 0xb4, 0xd9, 0xc7, 0xaa, - 0x1d, 0x70, 0xbf, 0xd2, 0x65, 0x08, 0x16, 0x7b, 0xcc, 0xa1, - 0xf0, 0x9d, 0x2a, 0x47, 0x59, 0x34, 0x83, 0xee, 0x42, 0x2f, - 0x98, 0xf5, 0xeb, 0x86, 0x31, 0x5c, 0x0d, 0x60, 0xd7, 0xba, - 0xa4, 0xc9, 0x7e, 0x13, 0xdc, 0xb1, 0x06, 0x6b, 0x75, 0x18, - 0xaf, 0xc2, 0x93, 0xfe, 0x49, 0x24, 0x3a, 0x57, 0xe0, 0x8d, - 0x63, 0x0e, 0xb9, 0xd4, 0xca, 0xa7, 0x10, 0x7d, 0x2c, 0x41, - 0xf6, 0x9b, 0x85, 0xe8, 0x5f, 0x32, 0xfd, 0x90, 0x27, 0x4a, - 0x54, 0x39, 0x8e, 0xe3, 0xb2, 0xdf, 0x68, 0x05, 0x1b, 0x76, - 0xc1, 0xac, 0x84, 0xe9, 0x5e, 0x33, 0x2d, 0x40, 0xf7, 0x9a, - 0xcb, 0xa6, 0x11, 0x7c, 0x62, 0x0f, 0xb8, 0xd5, 0x1a, 0x77, - 0xc0, 0xad, 0xb3, 0xde, 0x69, 0x04, 0x55, 0x38, 0x8f, 0xe2, - 0xfc, 0x91, 0x26, 0x4b, 0xa5, 0xc8, 0x7f, 0x12, 0x0c, 0x61, - 0xd6, 0xbb, 0xea, 0x87, 0x30, 0x5d, 0x43, 0x2e, 0x99, 0xf4, - 0x3b, 0x56, 0xe1, 0x8c, 0x92, 0xff, 0x48, 0x25, 0x74, 0x19, - 0xae, 0xc3, 0xdd, 0xb0, 0x07, 0x6a, 0xc6, 0xab, 0x1c, 0x71, - 0x6f, 0x02, 0xb5, 0xd8, 0x89, 0xe4, 0x53, 0x3e, 0x20, 0x4d, - 0xfa, 0x97, 0x58, 0x35, 0x82, 0xef, 0xf1, 0x9c, 0x2b, 0x46, - 0x17, 0x7a, 0xcd, 0xa0, 0xbe, 0xd3, 0x64, 0x09, 0xe7, 0x8a, - 0x3d, 0x50, 0x4e, 0x23, 0x94, 0xf9, 0xa8, 0xc5, 0x72, 0x1f, - 0x01, 0x6c, 0xdb, 0xb6, 0x79, 0x14, 0xa3, 0xce, 0xd0, 0xbd, - 0x0a, 0x67, 0x36, 0x5b, 0xec, 0x81, 0x9f, 0xf2, 0x45, 0x28, - 0x00, 0x6e, 0xdc, 0xb2, 0xa5, 0xcb, 0x79, 0x17, 0x57, 0x39, - 0x8b, 0xe5, 0xf2, 0x9c, 0x2e, 0x40, 0xae, 0xc0, 0x72, 0x1c, - 0x0b, 0x65, 0xd7, 0xb9, 0xf9, 0x97, 0x25, 0x4b, 0x5c, 0x32, - 0x80, 0xee, 0x41, 0x2f, 0x9d, 0xf3, 0xe4, 0x8a, 0x38, 0x56, - 0x16, 0x78, 0xca, 0xa4, 0xb3, 0xdd, 0x6f, 0x01, 0xef, 0x81, - 0x33, 0x5d, 0x4a, 0x24, 0x96, 0xf8, 0xb8, 0xd6, 0x64, 0x0a, - 0x1d, 0x73, 0xc1, 0xaf, 0x82, 0xec, 0x5e, 0x30, 0x27, 0x49, - 0xfb, 0x95, 0xd5, 0xbb, 0x09, 0x67, 0x70, 0x1e, 0xac, 0xc2, - 0x2c, 0x42, 0xf0, 0x9e, 0x89, 0xe7, 0x55, 0x3b, 0x7b, 0x15, - 0xa7, 0xc9, 0xde, 0xb0, 0x02, 0x6c, 0xc3, 0xad, 0x1f, 0x71, - 0x66, 0x08, 0xba, 0xd4, 0x94, 0xfa, 0x48, 0x26, 0x31, 0x5f, - 0xed, 0x83, 0x6d, 0x03, 0xb1, 0xdf, 0xc8, 0xa6, 0x14, 0x7a, - 0x3a, 0x54, 0xe6, 0x88, 0x9f, 0xf1, 0x43, 0x2d, 0x19, 0x77, - 0xc5, 0xab, 0xbc, 0xd2, 0x60, 0x0e, 0x4e, 0x20, 0x92, 0xfc, - 0xeb, 0x85, 0x37, 0x59, 0xb7, 0xd9, 0x6b, 0x05, 0x12, 0x7c, - 0xce, 0xa0, 0xe0, 0x8e, 0x3c, 0x52, 0x45, 0x2b, 0x99, 0xf7, - 0x58, 0x36, 0x84, 0xea, 0xfd, 0x93, 0x21, 0x4f, 0x0f, 0x61, - 0xd3, 0xbd, 0xaa, 0xc4, 0x76, 0x18, 0xf6, 0x98, 0x2a, 0x44, - 0x53, 0x3d, 0x8f, 0xe1, 0xa1, 0xcf, 0x7d, 0x13, 0x04, 0x6a, - 0xd8, 0xb6, 0x9b, 0xf5, 0x47, 0x29, 0x3e, 0x50, 0xe2, 0x8c, - 0xcc, 0xa2, 0x10, 0x7e, 0x69, 0x07, 0xb5, 0xdb, 0x35, 0x5b, - 0xe9, 0x87, 0x90, 0xfe, 0x4c, 0x22, 0x62, 0x0c, 0xbe, 0xd0, - 0xc7, 0xa9, 0x1b, 0x75, 0xda, 0xb4, 0x06, 0x68, 0x7f, 0x11, - 0xa3, 0xcd, 0x8d, 0xe3, 0x51, 0x3f, 0x28, 0x46, 0xf4, 0x9a, - 0x74, 0x1a, 0xa8, 0xc6, 0xd1, 0xbf, 0x0d, 0x63, 0x23, 0x4d, - 0xff, 0x91, 0x86, 0xe8, 0x5a, 0x34, 0x00, 0x6f, 0xde, 0xb1, - 0xa1, 0xce, 0x7f, 0x10, 0x5f, 0x30, 0x81, 0xee, 0xfe, 0x91, - 0x20, 0x4f, 0xbe, 0xd1, 0x60, 0x0f, 0x1f, 0x70, 0xc1, 0xae, - 0xe1, 0x8e, 0x3f, 0x50, 0x40, 0x2f, 0x9e, 0xf1, 0x61, 0x0e, - 0xbf, 0xd0, 0xc0, 0xaf, 0x1e, 0x71, 0x3e, 0x51, 0xe0, 0x8f, - 0x9f, 0xf0, 0x41, 0x2e, 0xdf, 0xb0, 0x01, 0x6e, 0x7e, 0x11, - 0xa0, 0xcf, 0x80, 0xef, 0x5e, 0x31, 0x21, 0x4e, 0xff, 0x90, - 0xc2, 0xad, 0x1c, 0x73, 0x63, 0x0c, 0xbd, 0xd2, 0x9d, 0xf2, - 0x43, 0x2c, 0x3c, 0x53, 0xe2, 0x8d, 0x7c, 0x13, 0xa2, 0xcd, - 0xdd, 0xb2, 0x03, 0x6c, 0x23, 0x4c, 0xfd, 0x92, 0x82, 0xed, - 0x5c, 0x33, 0xa3, 0xcc, 0x7d, 0x12, 0x02, 0x6d, 0xdc, 0xb3, - 0xfc, 0x93, 0x22, 0x4d, 0x5d, 0x32, 0x83, 0xec, 0x1d, 0x72, - 0xc3, 0xac, 0xbc, 0xd3, 0x62, 0x0d, 0x42, 0x2d, 0x9c, 0xf3, - 0xe3, 0x8c, 0x3d, 0x52, 0x99, 0xf6, 0x47, 0x28, 0x38, 0x57, - 0xe6, 0x89, 0xc6, 0xa9, 0x18, 0x77, 0x67, 0x08, 0xb9, 0xd6, - 0x27, 0x48, 0xf9, 0x96, 0x86, 0xe9, 0x58, 0x37, 0x78, 0x17, - 0xa6, 0xc9, 0xd9, 0xb6, 0x07, 0x68, 0xf8, 0x97, 0x26, 0x49, - 0x59, 0x36, 0x87, 0xe8, 0xa7, 0xc8, 0x79, 0x16, 0x06, 0x69, - 0xd8, 0xb7, 0x46, 0x29, 0x98, 0xf7, 0xe7, 0x88, 0x39, 0x56, - 0x19, 0x76, 0xc7, 0xa8, 0xb8, 0xd7, 0x66, 0x09, 0x5b, 0x34, - 0x85, 0xea, 0xfa, 0x95, 0x24, 0x4b, 0x04, 0x6b, 0xda, 0xb5, - 0xa5, 0xca, 0x7b, 0x14, 0xe5, 0x8a, 0x3b, 0x54, 0x44, 0x2b, - 0x9a, 0xf5, 0xba, 0xd5, 0x64, 0x0b, 0x1b, 0x74, 0xc5, 0xaa, - 0x3a, 0x55, 0xe4, 0x8b, 0x9b, 0xf4, 0x45, 0x2a, 0x65, 0x0a, - 0xbb, 0xd4, 0xc4, 0xab, 0x1a, 0x75, 0x84, 0xeb, 0x5a, 0x35, - 0x25, 0x4a, 0xfb, 0x94, 0xdb, 0xb4, 0x05, 0x6a, 0x7a, 0x15, - 0xa4, 0xcb, 0x00, 0x70, 0xe0, 0x90, 0xdd, 0xad, 0x3d, 0x4d, - 0xa7, 0xd7, 0x47, 0x37, 0x7a, 0x0a, 0x9a, 0xea, 0x53, 0x23, - 0xb3, 0xc3, 0x8e, 0xfe, 0x6e, 0x1e, 0xf4, 0x84, 0x14, 0x64, - 0x29, 0x59, 0xc9, 0xb9, 0xa6, 0xd6, 0x46, 0x36, 0x7b, 0x0b, - 0x9b, 0xeb, 0x01, 0x71, 0xe1, 0x91, 0xdc, 0xac, 0x3c, 0x4c, - 0xf5, 0x85, 0x15, 0x65, 0x28, 0x58, 0xc8, 0xb8, 0x52, 0x22, - 0xb2, 0xc2, 0x8f, 0xff, 0x6f, 0x1f, 0x51, 0x21, 0xb1, 0xc1, - 0x8c, 0xfc, 0x6c, 0x1c, 0xf6, 0x86, 0x16, 0x66, 0x2b, 0x5b, - 0xcb, 0xbb, 0x02, 0x72, 0xe2, 0x92, 0xdf, 0xaf, 0x3f, 0x4f, - 0xa5, 0xd5, 0x45, 0x35, 0x78, 0x08, 0x98, 0xe8, 0xf7, 0x87, - 0x17, 0x67, 0x2a, 0x5a, 0xca, 0xba, 0x50, 0x20, 0xb0, 0xc0, - 0x8d, 0xfd, 0x6d, 0x1d, 0xa4, 0xd4, 0x44, 0x34, 0x79, 0x09, - 0x99, 0xe9, 0x03, 0x73, 0xe3, 0x93, 0xde, 0xae, 0x3e, 0x4e, - 0xa2, 0xd2, 0x42, 0x32, 0x7f, 0x0f, 0x9f, 0xef, 0x05, 0x75, - 0xe5, 0x95, 0xd8, 0xa8, 0x38, 0x48, 0xf1, 0x81, 0x11, 0x61, - 0x2c, 0x5c, 0xcc, 0xbc, 0x56, 0x26, 0xb6, 0xc6, 0x8b, 0xfb, - 0x6b, 0x1b, 0x04, 0x74, 0xe4, 0x94, 0xd9, 0xa9, 0x39, 0x49, - 0xa3, 0xd3, 0x43, 0x33, 0x7e, 0x0e, 0x9e, 0xee, 0x57, 0x27, - 0xb7, 0xc7, 0x8a, 0xfa, 0x6a, 0x1a, 0xf0, 0x80, 0x10, 0x60, - 0x2d, 0x5d, 0xcd, 0xbd, 0xf3, 0x83, 0x13, 0x63, 0x2e, 0x5e, - 0xce, 0xbe, 0x54, 0x24, 0xb4, 0xc4, 0x89, 0xf9, 0x69, 0x19, - 0xa0, 0xd0, 0x40, 0x30, 0x7d, 0x0d, 0x9d, 0xed, 0x07, 0x77, - 0xe7, 0x97, 0xda, 0xaa, 0x3a, 0x4a, 0x55, 0x25, 0xb5, 0xc5, - 0x88, 0xf8, 0x68, 0x18, 0xf2, 0x82, 0x12, 0x62, 0x2f, 0x5f, - 0xcf, 0xbf, 0x06, 0x76, 0xe6, 0x96, 0xdb, 0xab, 0x3b, 0x4b, - 0xa1, 0xd1, 0x41, 0x31, 0x7c, 0x0c, 0x9c, 0xec, 0x00, 0x71, - 0xe2, 0x93, 0xd9, 0xa8, 0x3b, 0x4a, 0xaf, 0xde, 0x4d, 0x3c, - 0x76, 0x07, 0x94, 0xe5, 0x43, 0x32, 0xa1, 0xd0, 0x9a, 0xeb, - 0x78, 0x09, 0xec, 0x9d, 0x0e, 0x7f, 0x35, 0x44, 0xd7, 0xa6, - 0x86, 0xf7, 0x64, 0x15, 0x5f, 0x2e, 0xbd, 0xcc, 0x29, 0x58, - 0xcb, 0xba, 0xf0, 0x81, 0x12, 0x63, 0xc5, 0xb4, 0x27, 0x56, - 0x1c, 0x6d, 0xfe, 0x8f, 0x6a, 0x1b, 0x88, 0xf9, 0xb3, 0xc2, - 0x51, 0x20, 0x11, 0x60, 0xf3, 0x82, 0xc8, 0xb9, 0x2a, 0x5b, - 0xbe, 0xcf, 0x5c, 0x2d, 0x67, 0x16, 0x85, 0xf4, 0x52, 0x23, - 0xb0, 0xc1, 0x8b, 0xfa, 0x69, 0x18, 0xfd, 0x8c, 0x1f, 0x6e, - 0x24, 0x55, 0xc6, 0xb7, 0x97, 0xe6, 0x75, 0x04, 0x4e, 0x3f, - 0xac, 0xdd, 0x38, 0x49, 0xda, 0xab, 0xe1, 0x90, 0x03, 0x72, - 0xd4, 0xa5, 0x36, 0x47, 0x0d, 0x7c, 0xef, 0x9e, 0x7b, 0x0a, - 0x99, 0xe8, 0xa2, 0xd3, 0x40, 0x31, 0x22, 0x53, 0xc0, 0xb1, - 0xfb, 0x8a, 0x19, 0x68, 0x8d, 0xfc, 0x6f, 0x1e, 0x54, 0x25, - 0xb6, 0xc7, 0x61, 0x10, 0x83, 0xf2, 0xb8, 0xc9, 0x5a, 0x2b, - 0xce, 0xbf, 0x2c, 0x5d, 0x17, 0x66, 0xf5, 0x84, 0xa4, 0xd5, - 0x46, 0x37, 0x7d, 0x0c, 0x9f, 0xee, 0x0b, 0x7a, 0xe9, 0x98, - 0xd2, 0xa3, 0x30, 0x41, 0xe7, 0x96, 0x05, 0x74, 0x3e, 0x4f, - 0xdc, 0xad, 0x48, 0x39, 0xaa, 0xdb, 0x91, 0xe0, 0x73, 0x02, - 0x33, 0x42, 0xd1, 0xa0, 0xea, 0x9b, 0x08, 0x79, 0x9c, 0xed, - 0x7e, 0x0f, 0x45, 0x34, 0xa7, 0xd6, 0x70, 0x01, 0x92, 0xe3, - 0xa9, 0xd8, 0x4b, 0x3a, 0xdf, 0xae, 0x3d, 0x4c, 0x06, 0x77, - 0xe4, 0x95, 0xb5, 0xc4, 0x57, 0x26, 0x6c, 0x1d, 0x8e, 0xff, - 0x1a, 0x6b, 0xf8, 0x89, 0xc3, 0xb2, 0x21, 0x50, 0xf6, 0x87, - 0x14, 0x65, 0x2f, 0x5e, 0xcd, 0xbc, 0x59, 0x28, 0xbb, 0xca, - 0x80, 0xf1, 0x62, 0x13, 0x00, 0x72, 0xe4, 0x96, 0xd5, 0xa7, - 0x31, 0x43, 0xb7, 0xc5, 0x53, 0x21, 0x62, 0x10, 0x86, 0xf4, - 0x73, 0x01, 0x97, 0xe5, 0xa6, 0xd4, 0x42, 0x30, 0xc4, 0xb6, - 0x20, 0x52, 0x11, 0x63, 0xf5, 0x87, 0xe6, 0x94, 0x02, 0x70, - 0x33, 0x41, 0xd7, 0xa5, 0x51, 0x23, 0xb5, 0xc7, 0x84, 0xf6, - 0x60, 0x12, 0x95, 0xe7, 0x71, 0x03, 0x40, 0x32, 0xa4, 0xd6, - 0x22, 0x50, 0xc6, 0xb4, 0xf7, 0x85, 0x13, 0x61, 0xd1, 0xa3, - 0x35, 0x47, 0x04, 0x76, 0xe0, 0x92, 0x66, 0x14, 0x82, 0xf0, - 0xb3, 0xc1, 0x57, 0x25, 0xa2, 0xd0, 0x46, 0x34, 0x77, 0x05, - 0x93, 0xe1, 0x15, 0x67, 0xf1, 0x83, 0xc0, 0xb2, 0x24, 0x56, - 0x37, 0x45, 0xd3, 0xa1, 0xe2, 0x90, 0x06, 0x74, 0x80, 0xf2, - 0x64, 0x16, 0x55, 0x27, 0xb1, 0xc3, 0x44, 0x36, 0xa0, 0xd2, - 0x91, 0xe3, 0x75, 0x07, 0xf3, 0x81, 0x17, 0x65, 0x26, 0x54, - 0xc2, 0xb0, 0xbf, 0xcd, 0x5b, 0x29, 0x6a, 0x18, 0x8e, 0xfc, - 0x08, 0x7a, 0xec, 0x9e, 0xdd, 0xaf, 0x39, 0x4b, 0xcc, 0xbe, - 0x28, 0x5a, 0x19, 0x6b, 0xfd, 0x8f, 0x7b, 0x09, 0x9f, 0xed, - 0xae, 0xdc, 0x4a, 0x38, 0x59, 0x2b, 0xbd, 0xcf, 0x8c, 0xfe, - 0x68, 0x1a, 0xee, 0x9c, 0x0a, 0x78, 0x3b, 0x49, 0xdf, 0xad, - 0x2a, 0x58, 0xce, 0xbc, 0xff, 0x8d, 0x1b, 0x69, 0x9d, 0xef, - 0x79, 0x0b, 0x48, 0x3a, 0xac, 0xde, 0x6e, 0x1c, 0x8a, 0xf8, - 0xbb, 0xc9, 0x5f, 0x2d, 0xd9, 0xab, 0x3d, 0x4f, 0x0c, 0x7e, - 0xe8, 0x9a, 0x1d, 0x6f, 0xf9, 0x8b, 0xc8, 0xba, 0x2c, 0x5e, - 0xaa, 0xd8, 0x4e, 0x3c, 0x7f, 0x0d, 0x9b, 0xe9, 0x88, 0xfa, - 0x6c, 0x1e, 0x5d, 0x2f, 0xb9, 0xcb, 0x3f, 0x4d, 0xdb, 0xa9, - 0xea, 0x98, 0x0e, 0x7c, 0xfb, 0x89, 0x1f, 0x6d, 0x2e, 0x5c, - 0xca, 0xb8, 0x4c, 0x3e, 0xa8, 0xda, 0x99, 0xeb, 0x7d, 0x0f, - 0x00, 0x73, 0xe6, 0x95, 0xd1, 0xa2, 0x37, 0x44, 0xbf, 0xcc, - 0x59, 0x2a, 0x6e, 0x1d, 0x88, 0xfb, 0x63, 0x10, 0x85, 0xf6, - 0xb2, 0xc1, 0x54, 0x27, 0xdc, 0xaf, 0x3a, 0x49, 0x0d, 0x7e, - 0xeb, 0x98, 0xc6, 0xb5, 0x20, 0x53, 0x17, 0x64, 0xf1, 0x82, - 0x79, 0x0a, 0x9f, 0xec, 0xa8, 0xdb, 0x4e, 0x3d, 0xa5, 0xd6, - 0x43, 0x30, 0x74, 0x07, 0x92, 0xe1, 0x1a, 0x69, 0xfc, 0x8f, - 0xcb, 0xb8, 0x2d, 0x5e, 0x91, 0xe2, 0x77, 0x04, 0x40, 0x33, - 0xa6, 0xd5, 0x2e, 0x5d, 0xc8, 0xbb, 0xff, 0x8c, 0x19, 0x6a, - 0xf2, 0x81, 0x14, 0x67, 0x23, 0x50, 0xc5, 0xb6, 0x4d, 0x3e, - 0xab, 0xd8, 0x9c, 0xef, 0x7a, 0x09, 0x57, 0x24, 0xb1, 0xc2, - 0x86, 0xf5, 0x60, 0x13, 0xe8, 0x9b, 0x0e, 0x7d, 0x39, 0x4a, - 0xdf, 0xac, 0x34, 0x47, 0xd2, 0xa1, 0xe5, 0x96, 0x03, 0x70, - 0x8b, 0xf8, 0x6d, 0x1e, 0x5a, 0x29, 0xbc, 0xcf, 0x3f, 0x4c, - 0xd9, 0xaa, 0xee, 0x9d, 0x08, 0x7b, 0x80, 0xf3, 0x66, 0x15, - 0x51, 0x22, 0xb7, 0xc4, 0x5c, 0x2f, 0xba, 0xc9, 0x8d, 0xfe, - 0x6b, 0x18, 0xe3, 0x90, 0x05, 0x76, 0x32, 0x41, 0xd4, 0xa7, - 0xf9, 0x8a, 0x1f, 0x6c, 0x28, 0x5b, 0xce, 0xbd, 0x46, 0x35, - 0xa0, 0xd3, 0x97, 0xe4, 0x71, 0x02, 0x9a, 0xe9, 0x7c, 0x0f, - 0x4b, 0x38, 0xad, 0xde, 0x25, 0x56, 0xc3, 0xb0, 0xf4, 0x87, - 0x12, 0x61, 0xae, 0xdd, 0x48, 0x3b, 0x7f, 0x0c, 0x99, 0xea, - 0x11, 0x62, 0xf7, 0x84, 0xc0, 0xb3, 0x26, 0x55, 0xcd, 0xbe, - 0x2b, 0x58, 0x1c, 0x6f, 0xfa, 0x89, 0x72, 0x01, 0x94, 0xe7, - 0xa3, 0xd0, 0x45, 0x36, 0x68, 0x1b, 0x8e, 0xfd, 0xb9, 0xca, - 0x5f, 0x2c, 0xd7, 0xa4, 0x31, 0x42, 0x06, 0x75, 0xe0, 0x93, - 0x0b, 0x78, 0xed, 0x9e, 0xda, 0xa9, 0x3c, 0x4f, 0xb4, 0xc7, - 0x52, 0x21, 0x65, 0x16, 0x83, 0xf0, 0x00, 0x74, 0xe8, 0x9c, - 0xcd, 0xb9, 0x25, 0x51, 0x87, 0xf3, 0x6f, 0x1b, 0x4a, 0x3e, - 0xa2, 0xd6, 0x13, 0x67, 0xfb, 0x8f, 0xde, 0xaa, 0x36, 0x42, - 0x94, 0xe0, 0x7c, 0x08, 0x59, 0x2d, 0xb1, 0xc5, 0x26, 0x52, - 0xce, 0xba, 0xeb, 0x9f, 0x03, 0x77, 0xa1, 0xd5, 0x49, 0x3d, - 0x6c, 0x18, 0x84, 0xf0, 0x35, 0x41, 0xdd, 0xa9, 0xf8, 0x8c, - 0x10, 0x64, 0xb2, 0xc6, 0x5a, 0x2e, 0x7f, 0x0b, 0x97, 0xe3, - 0x4c, 0x38, 0xa4, 0xd0, 0x81, 0xf5, 0x69, 0x1d, 0xcb, 0xbf, - 0x23, 0x57, 0x06, 0x72, 0xee, 0x9a, 0x5f, 0x2b, 0xb7, 0xc3, - 0x92, 0xe6, 0x7a, 0x0e, 0xd8, 0xac, 0x30, 0x44, 0x15, 0x61, - 0xfd, 0x89, 0x6a, 0x1e, 0x82, 0xf6, 0xa7, 0xd3, 0x4f, 0x3b, - 0xed, 0x99, 0x05, 0x71, 0x20, 0x54, 0xc8, 0xbc, 0x79, 0x0d, - 0x91, 0xe5, 0xb4, 0xc0, 0x5c, 0x28, 0xfe, 0x8a, 0x16, 0x62, - 0x33, 0x47, 0xdb, 0xaf, 0x98, 0xec, 0x70, 0x04, 0x55, 0x21, - 0xbd, 0xc9, 0x1f, 0x6b, 0xf7, 0x83, 0xd2, 0xa6, 0x3a, 0x4e, - 0x8b, 0xff, 0x63, 0x17, 0x46, 0x32, 0xae, 0xda, 0x0c, 0x78, - 0xe4, 0x90, 0xc1, 0xb5, 0x29, 0x5d, 0xbe, 0xca, 0x56, 0x22, - 0x73, 0x07, 0x9b, 0xef, 0x39, 0x4d, 0xd1, 0xa5, 0xf4, 0x80, - 0x1c, 0x68, 0xad, 0xd9, 0x45, 0x31, 0x60, 0x14, 0x88, 0xfc, - 0x2a, 0x5e, 0xc2, 0xb6, 0xe7, 0x93, 0x0f, 0x7b, 0xd4, 0xa0, - 0x3c, 0x48, 0x19, 0x6d, 0xf1, 0x85, 0x53, 0x27, 0xbb, 0xcf, - 0x9e, 0xea, 0x76, 0x02, 0xc7, 0xb3, 0x2f, 0x5b, 0x0a, 0x7e, - 0xe2, 0x96, 0x40, 0x34, 0xa8, 0xdc, 0x8d, 0xf9, 0x65, 0x11, - 0xf2, 0x86, 0x1a, 0x6e, 0x3f, 0x4b, 0xd7, 0xa3, 0x75, 0x01, - 0x9d, 0xe9, 0xb8, 0xcc, 0x50, 0x24, 0xe1, 0x95, 0x09, 0x7d, - 0x2c, 0x58, 0xc4, 0xb0, 0x66, 0x12, 0x8e, 0xfa, 0xab, 0xdf, - 0x43, 0x37, 0x00, 0x75, 0xea, 0x9f, 0xc9, 0xbc, 0x23, 0x56, - 0x8f, 0xfa, 0x65, 0x10, 0x46, 0x33, 0xac, 0xd9, 0x03, 0x76, - 0xe9, 0x9c, 0xca, 0xbf, 0x20, 0x55, 0x8c, 0xf9, 0x66, 0x13, - 0x45, 0x30, 0xaf, 0xda, 0x06, 0x73, 0xec, 0x99, 0xcf, 0xba, - 0x25, 0x50, 0x89, 0xfc, 0x63, 0x16, 0x40, 0x35, 0xaa, 0xdf, - 0x05, 0x70, 0xef, 0x9a, 0xcc, 0xb9, 0x26, 0x53, 0x8a, 0xff, - 0x60, 0x15, 0x43, 0x36, 0xa9, 0xdc, 0x0c, 0x79, 0xe6, 0x93, - 0xc5, 0xb0, 0x2f, 0x5a, 0x83, 0xf6, 0x69, 0x1c, 0x4a, 0x3f, - 0xa0, 0xd5, 0x0f, 0x7a, 0xe5, 0x90, 0xc6, 0xb3, 0x2c, 0x59, - 0x80, 0xf5, 0x6a, 0x1f, 0x49, 0x3c, 0xa3, 0xd6, 0x0a, 0x7f, - 0xe0, 0x95, 0xc3, 0xb6, 0x29, 0x5c, 0x85, 0xf0, 0x6f, 0x1a, - 0x4c, 0x39, 0xa6, 0xd3, 0x09, 0x7c, 0xe3, 0x96, 0xc0, 0xb5, - 0x2a, 0x5f, 0x86, 0xf3, 0x6c, 0x19, 0x4f, 0x3a, 0xa5, 0xd0, - 0x18, 0x6d, 0xf2, 0x87, 0xd1, 0xa4, 0x3b, 0x4e, 0x97, 0xe2, - 0x7d, 0x08, 0x5e, 0x2b, 0xb4, 0xc1, 0x1b, 0x6e, 0xf1, 0x84, - 0xd2, 0xa7, 0x38, 0x4d, 0x94, 0xe1, 0x7e, 0x0b, 0x5d, 0x28, - 0xb7, 0xc2, 0x1e, 0x6b, 0xf4, 0x81, 0xd7, 0xa2, 0x3d, 0x48, - 0x91, 0xe4, 0x7b, 0x0e, 0x58, 0x2d, 0xb2, 0xc7, 0x1d, 0x68, - 0xf7, 0x82, 0xd4, 0xa1, 0x3e, 0x4b, 0x92, 0xe7, 0x78, 0x0d, - 0x5b, 0x2e, 0xb1, 0xc4, 0x14, 0x61, 0xfe, 0x8b, 0xdd, 0xa8, - 0x37, 0x42, 0x9b, 0xee, 0x71, 0x04, 0x52, 0x27, 0xb8, 0xcd, - 0x17, 0x62, 0xfd, 0x88, 0xde, 0xab, 0x34, 0x41, 0x98, 0xed, - 0x72, 0x07, 0x51, 0x24, 0xbb, 0xce, 0x12, 0x67, 0xf8, 0x8d, - 0xdb, 0xae, 0x31, 0x44, 0x9d, 0xe8, 0x77, 0x02, 0x54, 0x21, - 0xbe, 0xcb, 0x11, 0x64, 0xfb, 0x8e, 0xd8, 0xad, 0x32, 0x47, - 0x9e, 0xeb, 0x74, 0x01, 0x57, 0x22, 0xbd, 0xc8, 0x00, 0x76, - 0xec, 0x9a, 0xc5, 0xb3, 0x29, 0x5f, 0x97, 0xe1, 0x7b, 0x0d, - 0x52, 0x24, 0xbe, 0xc8, 0x33, 0x45, 0xdf, 0xa9, 0xf6, 0x80, - 0x1a, 0x6c, 0xa4, 0xd2, 0x48, 0x3e, 0x61, 0x17, 0x8d, 0xfb, - 0x66, 0x10, 0x8a, 0xfc, 0xa3, 0xd5, 0x4f, 0x39, 0xf1, 0x87, - 0x1d, 0x6b, 0x34, 0x42, 0xd8, 0xae, 0x55, 0x23, 0xb9, 0xcf, - 0x90, 0xe6, 0x7c, 0x0a, 0xc2, 0xb4, 0x2e, 0x58, 0x07, 0x71, - 0xeb, 0x9d, 0xcc, 0xba, 0x20, 0x56, 0x09, 0x7f, 0xe5, 0x93, - 0x5b, 0x2d, 0xb7, 0xc1, 0x9e, 0xe8, 0x72, 0x04, 0xff, 0x89, - 0x13, 0x65, 0x3a, 0x4c, 0xd6, 0xa0, 0x68, 0x1e, 0x84, 0xf2, - 0xad, 0xdb, 0x41, 0x37, 0xaa, 0xdc, 0x46, 0x30, 0x6f, 0x19, - 0x83, 0xf5, 0x3d, 0x4b, 0xd1, 0xa7, 0xf8, 0x8e, 0x14, 0x62, - 0x99, 0xef, 0x75, 0x03, 0x5c, 0x2a, 0xb0, 0xc6, 0x0e, 0x78, - 0xe2, 0x94, 0xcb, 0xbd, 0x27, 0x51, 0x85, 0xf3, 0x69, 0x1f, - 0x40, 0x36, 0xac, 0xda, 0x12, 0x64, 0xfe, 0x88, 0xd7, 0xa1, - 0x3b, 0x4d, 0xb6, 0xc0, 0x5a, 0x2c, 0x73, 0x05, 0x9f, 0xe9, - 0x21, 0x57, 0xcd, 0xbb, 0xe4, 0x92, 0x08, 0x7e, 0xe3, 0x95, - 0x0f, 0x79, 0x26, 0x50, 0xca, 0xbc, 0x74, 0x02, 0x98, 0xee, - 0xb1, 0xc7, 0x5d, 0x2b, 0xd0, 0xa6, 0x3c, 0x4a, 0x15, 0x63, - 0xf9, 0x8f, 0x47, 0x31, 0xab, 0xdd, 0x82, 0xf4, 0x6e, 0x18, - 0x49, 0x3f, 0xa5, 0xd3, 0x8c, 0xfa, 0x60, 0x16, 0xde, 0xa8, - 0x32, 0x44, 0x1b, 0x6d, 0xf7, 0x81, 0x7a, 0x0c, 0x96, 0xe0, - 0xbf, 0xc9, 0x53, 0x25, 0xed, 0x9b, 0x01, 0x77, 0x28, 0x5e, - 0xc4, 0xb2, 0x2f, 0x59, 0xc3, 0xb5, 0xea, 0x9c, 0x06, 0x70, - 0xb8, 0xce, 0x54, 0x22, 0x7d, 0x0b, 0x91, 0xe7, 0x1c, 0x6a, - 0xf0, 0x86, 0xd9, 0xaf, 0x35, 0x43, 0x8b, 0xfd, 0x67, 0x11, - 0x4e, 0x38, 0xa2, 0xd4, 0x00, 0x77, 0xee, 0x99, 0xc1, 0xb6, - 0x2f, 0x58, 0x9f, 0xe8, 0x71, 0x06, 0x5e, 0x29, 0xb0, 0xc7, - 0x23, 0x54, 0xcd, 0xba, 0xe2, 0x95, 0x0c, 0x7b, 0xbc, 0xcb, - 0x52, 0x25, 0x7d, 0x0a, 0x93, 0xe4, 0x46, 0x31, 0xa8, 0xdf, - 0x87, 0xf0, 0x69, 0x1e, 0xd9, 0xae, 0x37, 0x40, 0x18, 0x6f, - 0xf6, 0x81, 0x65, 0x12, 0x8b, 0xfc, 0xa4, 0xd3, 0x4a, 0x3d, - 0xfa, 0x8d, 0x14, 0x63, 0x3b, 0x4c, 0xd5, 0xa2, 0x8c, 0xfb, - 0x62, 0x15, 0x4d, 0x3a, 0xa3, 0xd4, 0x13, 0x64, 0xfd, 0x8a, - 0xd2, 0xa5, 0x3c, 0x4b, 0xaf, 0xd8, 0x41, 0x36, 0x6e, 0x19, - 0x80, 0xf7, 0x30, 0x47, 0xde, 0xa9, 0xf1, 0x86, 0x1f, 0x68, - 0xca, 0xbd, 0x24, 0x53, 0x0b, 0x7c, 0xe5, 0x92, 0x55, 0x22, - 0xbb, 0xcc, 0x94, 0xe3, 0x7a, 0x0d, 0xe9, 0x9e, 0x07, 0x70, - 0x28, 0x5f, 0xc6, 0xb1, 0x76, 0x01, 0x98, 0xef, 0xb7, 0xc0, - 0x59, 0x2e, 0x05, 0x72, 0xeb, 0x9c, 0xc4, 0xb3, 0x2a, 0x5d, - 0x9a, 0xed, 0x74, 0x03, 0x5b, 0x2c, 0xb5, 0xc2, 0x26, 0x51, - 0xc8, 0xbf, 0xe7, 0x90, 0x09, 0x7e, 0xb9, 0xce, 0x57, 0x20, - 0x78, 0x0f, 0x96, 0xe1, 0x43, 0x34, 0xad, 0xda, 0x82, 0xf5, - 0x6c, 0x1b, 0xdc, 0xab, 0x32, 0x45, 0x1d, 0x6a, 0xf3, 0x84, - 0x60, 0x17, 0x8e, 0xf9, 0xa1, 0xd6, 0x4f, 0x38, 0xff, 0x88, - 0x11, 0x66, 0x3e, 0x49, 0xd0, 0xa7, 0x89, 0xfe, 0x67, 0x10, - 0x48, 0x3f, 0xa6, 0xd1, 0x16, 0x61, 0xf8, 0x8f, 0xd7, 0xa0, - 0x39, 0x4e, 0xaa, 0xdd, 0x44, 0x33, 0x6b, 0x1c, 0x85, 0xf2, - 0x35, 0x42, 0xdb, 0xac, 0xf4, 0x83, 0x1a, 0x6d, 0xcf, 0xb8, - 0x21, 0x56, 0x0e, 0x79, 0xe0, 0x97, 0x50, 0x27, 0xbe, 0xc9, - 0x91, 0xe6, 0x7f, 0x08, 0xec, 0x9b, 0x02, 0x75, 0x2d, 0x5a, - 0xc3, 0xb4, 0x73, 0x04, 0x9d, 0xea, 0xb2, 0xc5, 0x5c, 0x2b, - 0x00, 0x78, 0xf0, 0x88, 0xfd, 0x85, 0x0d, 0x75, 0xe7, 0x9f, - 0x17, 0x6f, 0x1a, 0x62, 0xea, 0x92, 0xd3, 0xab, 0x23, 0x5b, - 0x2e, 0x56, 0xde, 0xa6, 0x34, 0x4c, 0xc4, 0xbc, 0xc9, 0xb1, - 0x39, 0x41, 0xbb, 0xc3, 0x4b, 0x33, 0x46, 0x3e, 0xb6, 0xce, - 0x5c, 0x24, 0xac, 0xd4, 0xa1, 0xd9, 0x51, 0x29, 0x68, 0x10, - 0x98, 0xe0, 0x95, 0xed, 0x65, 0x1d, 0x8f, 0xf7, 0x7f, 0x07, - 0x72, 0x0a, 0x82, 0xfa, 0x6b, 0x13, 0x9b, 0xe3, 0x96, 0xee, - 0x66, 0x1e, 0x8c, 0xf4, 0x7c, 0x04, 0x71, 0x09, 0x81, 0xf9, - 0xb8, 0xc0, 0x48, 0x30, 0x45, 0x3d, 0xb5, 0xcd, 0x5f, 0x27, - 0xaf, 0xd7, 0xa2, 0xda, 0x52, 0x2a, 0xd0, 0xa8, 0x20, 0x58, - 0x2d, 0x55, 0xdd, 0xa5, 0x37, 0x4f, 0xc7, 0xbf, 0xca, 0xb2, - 0x3a, 0x42, 0x03, 0x7b, 0xf3, 0x8b, 0xfe, 0x86, 0x0e, 0x76, - 0xe4, 0x9c, 0x14, 0x6c, 0x19, 0x61, 0xe9, 0x91, 0xd6, 0xae, - 0x26, 0x5e, 0x2b, 0x53, 0xdb, 0xa3, 0x31, 0x49, 0xc1, 0xb9, - 0xcc, 0xb4, 0x3c, 0x44, 0x05, 0x7d, 0xf5, 0x8d, 0xf8, 0x80, - 0x08, 0x70, 0xe2, 0x9a, 0x12, 0x6a, 0x1f, 0x67, 0xef, 0x97, - 0x6d, 0x15, 0x9d, 0xe5, 0x90, 0xe8, 0x60, 0x18, 0x8a, 0xf2, - 0x7a, 0x02, 0x77, 0x0f, 0x87, 0xff, 0xbe, 0xc6, 0x4e, 0x36, - 0x43, 0x3b, 0xb3, 0xcb, 0x59, 0x21, 0xa9, 0xd1, 0xa4, 0xdc, - 0x54, 0x2c, 0xbd, 0xc5, 0x4d, 0x35, 0x40, 0x38, 0xb0, 0xc8, - 0x5a, 0x22, 0xaa, 0xd2, 0xa7, 0xdf, 0x57, 0x2f, 0x6e, 0x16, - 0x9e, 0xe6, 0x93, 0xeb, 0x63, 0x1b, 0x89, 0xf1, 0x79, 0x01, - 0x74, 0x0c, 0x84, 0xfc, 0x06, 0x7e, 0xf6, 0x8e, 0xfb, 0x83, - 0x0b, 0x73, 0xe1, 0x99, 0x11, 0x69, 0x1c, 0x64, 0xec, 0x94, - 0xd5, 0xad, 0x25, 0x5d, 0x28, 0x50, 0xd8, 0xa0, 0x32, 0x4a, - 0xc2, 0xba, 0xcf, 0xb7, 0x3f, 0x47, 0x00, 0x79, 0xf2, 0x8b, - 0xf9, 0x80, 0x0b, 0x72, 0xef, 0x96, 0x1d, 0x64, 0x16, 0x6f, - 0xe4, 0x9d, 0xc3, 0xba, 0x31, 0x48, 0x3a, 0x43, 0xc8, 0xb1, - 0x2c, 0x55, 0xde, 0xa7, 0xd5, 0xac, 0x27, 0x5e, 0x9b, 0xe2, - 0x69, 0x10, 0x62, 0x1b, 0x90, 0xe9, 0x74, 0x0d, 0x86, 0xff, - 0x8d, 0xf4, 0x7f, 0x06, 0x58, 0x21, 0xaa, 0xd3, 0xa1, 0xd8, - 0x53, 0x2a, 0xb7, 0xce, 0x45, 0x3c, 0x4e, 0x37, 0xbc, 0xc5, - 0x2b, 0x52, 0xd9, 0xa0, 0xd2, 0xab, 0x20, 0x59, 0xc4, 0xbd, - 0x36, 0x4f, 0x3d, 0x44, 0xcf, 0xb6, 0xe8, 0x91, 0x1a, 0x63, - 0x11, 0x68, 0xe3, 0x9a, 0x07, 0x7e, 0xf5, 0x8c, 0xfe, 0x87, - 0x0c, 0x75, 0xb0, 0xc9, 0x42, 0x3b, 0x49, 0x30, 0xbb, 0xc2, - 0x5f, 0x26, 0xad, 0xd4, 0xa6, 0xdf, 0x54, 0x2d, 0x73, 0x0a, - 0x81, 0xf8, 0x8a, 0xf3, 0x78, 0x01, 0x9c, 0xe5, 0x6e, 0x17, - 0x65, 0x1c, 0x97, 0xee, 0x56, 0x2f, 0xa4, 0xdd, 0xaf, 0xd6, - 0x5d, 0x24, 0xb9, 0xc0, 0x4b, 0x32, 0x40, 0x39, 0xb2, 0xcb, - 0x95, 0xec, 0x67, 0x1e, 0x6c, 0x15, 0x9e, 0xe7, 0x7a, 0x03, - 0x88, 0xf1, 0x83, 0xfa, 0x71, 0x08, 0xcd, 0xb4, 0x3f, 0x46, - 0x34, 0x4d, 0xc6, 0xbf, 0x22, 0x5b, 0xd0, 0xa9, 0xdb, 0xa2, - 0x29, 0x50, 0x0e, 0x77, 0xfc, 0x85, 0xf7, 0x8e, 0x05, 0x7c, - 0xe1, 0x98, 0x13, 0x6a, 0x18, 0x61, 0xea, 0x93, 0x7d, 0x04, - 0x8f, 0xf6, 0x84, 0xfd, 0x76, 0x0f, 0x92, 0xeb, 0x60, 0x19, - 0x6b, 0x12, 0x99, 0xe0, 0xbe, 0xc7, 0x4c, 0x35, 0x47, 0x3e, - 0xb5, 0xcc, 0x51, 0x28, 0xa3, 0xda, 0xa8, 0xd1, 0x5a, 0x23, - 0xe6, 0x9f, 0x14, 0x6d, 0x1f, 0x66, 0xed, 0x94, 0x09, 0x70, - 0xfb, 0x82, 0xf0, 0x89, 0x02, 0x7b, 0x25, 0x5c, 0xd7, 0xae, - 0xdc, 0xa5, 0x2e, 0x57, 0xca, 0xb3, 0x38, 0x41, 0x33, 0x4a, - 0xc1, 0xb8, 0x00, 0x7a, 0xf4, 0x8e, 0xf5, 0x8f, 0x01, 0x7b, - 0xf7, 0x8d, 0x03, 0x79, 0x02, 0x78, 0xf6, 0x8c, 0xf3, 0x89, - 0x07, 0x7d, 0x06, 0x7c, 0xf2, 0x88, 0x04, 0x7e, 0xf0, 0x8a, - 0xf1, 0x8b, 0x05, 0x7f, 0xfb, 0x81, 0x0f, 0x75, 0x0e, 0x74, - 0xfa, 0x80, 0x0c, 0x76, 0xf8, 0x82, 0xf9, 0x83, 0x0d, 0x77, - 0x08, 0x72, 0xfc, 0x86, 0xfd, 0x87, 0x09, 0x73, 0xff, 0x85, - 0x0b, 0x71, 0x0a, 0x70, 0xfe, 0x84, 0xeb, 0x91, 0x1f, 0x65, - 0x1e, 0x64, 0xea, 0x90, 0x1c, 0x66, 0xe8, 0x92, 0xe9, 0x93, - 0x1d, 0x67, 0x18, 0x62, 0xec, 0x96, 0xed, 0x97, 0x19, 0x63, - 0xef, 0x95, 0x1b, 0x61, 0x1a, 0x60, 0xee, 0x94, 0x10, 0x6a, - 0xe4, 0x9e, 0xe5, 0x9f, 0x11, 0x6b, 0xe7, 0x9d, 0x13, 0x69, - 0x12, 0x68, 0xe6, 0x9c, 0xe3, 0x99, 0x17, 0x6d, 0x16, 0x6c, - 0xe2, 0x98, 0x14, 0x6e, 0xe0, 0x9a, 0xe1, 0x9b, 0x15, 0x6f, - 0xcb, 0xb1, 0x3f, 0x45, 0x3e, 0x44, 0xca, 0xb0, 0x3c, 0x46, - 0xc8, 0xb2, 0xc9, 0xb3, 0x3d, 0x47, 0x38, 0x42, 0xcc, 0xb6, - 0xcd, 0xb7, 0x39, 0x43, 0xcf, 0xb5, 0x3b, 0x41, 0x3a, 0x40, - 0xce, 0xb4, 0x30, 0x4a, 0xc4, 0xbe, 0xc5, 0xbf, 0x31, 0x4b, - 0xc7, 0xbd, 0x33, 0x49, 0x32, 0x48, 0xc6, 0xbc, 0xc3, 0xb9, - 0x37, 0x4d, 0x36, 0x4c, 0xc2, 0xb8, 0x34, 0x4e, 0xc0, 0xba, - 0xc1, 0xbb, 0x35, 0x4f, 0x20, 0x5a, 0xd4, 0xae, 0xd5, 0xaf, - 0x21, 0x5b, 0xd7, 0xad, 0x23, 0x59, 0x22, 0x58, 0xd6, 0xac, - 0xd3, 0xa9, 0x27, 0x5d, 0x26, 0x5c, 0xd2, 0xa8, 0x24, 0x5e, - 0xd0, 0xaa, 0xd1, 0xab, 0x25, 0x5f, 0xdb, 0xa1, 0x2f, 0x55, - 0x2e, 0x54, 0xda, 0xa0, 0x2c, 0x56, 0xd8, 0xa2, 0xd9, 0xa3, - 0x2d, 0x57, 0x28, 0x52, 0xdc, 0xa6, 0xdd, 0xa7, 0x29, 0x53, - 0xdf, 0xa5, 0x2b, 0x51, 0x2a, 0x50, 0xde, 0xa4, 0x00, 0x7b, - 0xf6, 0x8d, 0xf1, 0x8a, 0x07, 0x7c, 0xff, 0x84, 0x09, 0x72, - 0x0e, 0x75, 0xf8, 0x83, 0xe3, 0x98, 0x15, 0x6e, 0x12, 0x69, - 0xe4, 0x9f, 0x1c, 0x67, 0xea, 0x91, 0xed, 0x96, 0x1b, 0x60, - 0xdb, 0xa0, 0x2d, 0x56, 0x2a, 0x51, 0xdc, 0xa7, 0x24, 0x5f, - 0xd2, 0xa9, 0xd5, 0xae, 0x23, 0x58, 0x38, 0x43, 0xce, 0xb5, - 0xc9, 0xb2, 0x3f, 0x44, 0xc7, 0xbc, 0x31, 0x4a, 0x36, 0x4d, - 0xc0, 0xbb, 0xab, 0xd0, 0x5d, 0x26, 0x5a, 0x21, 0xac, 0xd7, - 0x54, 0x2f, 0xa2, 0xd9, 0xa5, 0xde, 0x53, 0x28, 0x48, 0x33, - 0xbe, 0xc5, 0xb9, 0xc2, 0x4f, 0x34, 0xb7, 0xcc, 0x41, 0x3a, - 0x46, 0x3d, 0xb0, 0xcb, 0x70, 0x0b, 0x86, 0xfd, 0x81, 0xfa, - 0x77, 0x0c, 0x8f, 0xf4, 0x79, 0x02, 0x7e, 0x05, 0x88, 0xf3, - 0x93, 0xe8, 0x65, 0x1e, 0x62, 0x19, 0x94, 0xef, 0x6c, 0x17, - 0x9a, 0xe1, 0x9d, 0xe6, 0x6b, 0x10, 0x4b, 0x30, 0xbd, 0xc6, - 0xba, 0xc1, 0x4c, 0x37, 0xb4, 0xcf, 0x42, 0x39, 0x45, 0x3e, - 0xb3, 0xc8, 0xa8, 0xd3, 0x5e, 0x25, 0x59, 0x22, 0xaf, 0xd4, - 0x57, 0x2c, 0xa1, 0xda, 0xa6, 0xdd, 0x50, 0x2b, 0x90, 0xeb, - 0x66, 0x1d, 0x61, 0x1a, 0x97, 0xec, 0x6f, 0x14, 0x99, 0xe2, - 0x9e, 0xe5, 0x68, 0x13, 0x73, 0x08, 0x85, 0xfe, 0x82, 0xf9, - 0x74, 0x0f, 0x8c, 0xf7, 0x7a, 0x01, 0x7d, 0x06, 0x8b, 0xf0, - 0xe0, 0x9b, 0x16, 0x6d, 0x11, 0x6a, 0xe7, 0x9c, 0x1f, 0x64, - 0xe9, 0x92, 0xee, 0x95, 0x18, 0x63, 0x03, 0x78, 0xf5, 0x8e, - 0xf2, 0x89, 0x04, 0x7f, 0xfc, 0x87, 0x0a, 0x71, 0x0d, 0x76, - 0xfb, 0x80, 0x3b, 0x40, 0xcd, 0xb6, 0xca, 0xb1, 0x3c, 0x47, - 0xc4, 0xbf, 0x32, 0x49, 0x35, 0x4e, 0xc3, 0xb8, 0xd8, 0xa3, - 0x2e, 0x55, 0x29, 0x52, 0xdf, 0xa4, 0x27, 0x5c, 0xd1, 0xaa, - 0xd6, 0xad, 0x20, 0x5b, 0x00, 0x7c, 0xf8, 0x84, 0xed, 0x91, - 0x15, 0x69, 0xc7, 0xbb, 0x3f, 0x43, 0x2a, 0x56, 0xd2, 0xae, - 0x93, 0xef, 0x6b, 0x17, 0x7e, 0x02, 0x86, 0xfa, 0x54, 0x28, - 0xac, 0xd0, 0xb9, 0xc5, 0x41, 0x3d, 0x3b, 0x47, 0xc3, 0xbf, - 0xd6, 0xaa, 0x2e, 0x52, 0xfc, 0x80, 0x04, 0x78, 0x11, 0x6d, - 0xe9, 0x95, 0xa8, 0xd4, 0x50, 0x2c, 0x45, 0x39, 0xbd, 0xc1, - 0x6f, 0x13, 0x97, 0xeb, 0x82, 0xfe, 0x7a, 0x06, 0x76, 0x0a, - 0x8e, 0xf2, 0x9b, 0xe7, 0x63, 0x1f, 0xb1, 0xcd, 0x49, 0x35, - 0x5c, 0x20, 0xa4, 0xd8, 0xe5, 0x99, 0x1d, 0x61, 0x08, 0x74, - 0xf0, 0x8c, 0x22, 0x5e, 0xda, 0xa6, 0xcf, 0xb3, 0x37, 0x4b, - 0x4d, 0x31, 0xb5, 0xc9, 0xa0, 0xdc, 0x58, 0x24, 0x8a, 0xf6, - 0x72, 0x0e, 0x67, 0x1b, 0x9f, 0xe3, 0xde, 0xa2, 0x26, 0x5a, - 0x33, 0x4f, 0xcb, 0xb7, 0x19, 0x65, 0xe1, 0x9d, 0xf4, 0x88, - 0x0c, 0x70, 0xec, 0x90, 0x14, 0x68, 0x01, 0x7d, 0xf9, 0x85, - 0x2b, 0x57, 0xd3, 0xaf, 0xc6, 0xba, 0x3e, 0x42, 0x7f, 0x03, - 0x87, 0xfb, 0x92, 0xee, 0x6a, 0x16, 0xb8, 0xc4, 0x40, 0x3c, - 0x55, 0x29, 0xad, 0xd1, 0xd7, 0xab, 0x2f, 0x53, 0x3a, 0x46, - 0xc2, 0xbe, 0x10, 0x6c, 0xe8, 0x94, 0xfd, 0x81, 0x05, 0x79, - 0x44, 0x38, 0xbc, 0xc0, 0xa9, 0xd5, 0x51, 0x2d, 0x83, 0xff, - 0x7b, 0x07, 0x6e, 0x12, 0x96, 0xea, 0x9a, 0xe6, 0x62, 0x1e, - 0x77, 0x0b, 0x8f, 0xf3, 0x5d, 0x21, 0xa5, 0xd9, 0xb0, 0xcc, - 0x48, 0x34, 0x09, 0x75, 0xf1, 0x8d, 0xe4, 0x98, 0x1c, 0x60, - 0xce, 0xb2, 0x36, 0x4a, 0x23, 0x5f, 0xdb, 0xa7, 0xa1, 0xdd, - 0x59, 0x25, 0x4c, 0x30, 0xb4, 0xc8, 0x66, 0x1a, 0x9e, 0xe2, - 0x8b, 0xf7, 0x73, 0x0f, 0x32, 0x4e, 0xca, 0xb6, 0xdf, 0xa3, - 0x27, 0x5b, 0xf5, 0x89, 0x0d, 0x71, 0x18, 0x64, 0xe0, 0x9c, - 0x00, 0x7d, 0xfa, 0x87, 0xe9, 0x94, 0x13, 0x6e, 0xcf, 0xb2, - 0x35, 0x48, 0x26, 0x5b, 0xdc, 0xa1, 0x83, 0xfe, 0x79, 0x04, - 0x6a, 0x17, 0x90, 0xed, 0x4c, 0x31, 0xb6, 0xcb, 0xa5, 0xd8, - 0x5f, 0x22, 0x1b, 0x66, 0xe1, 0x9c, 0xf2, 0x8f, 0x08, 0x75, - 0xd4, 0xa9, 0x2e, 0x53, 0x3d, 0x40, 0xc7, 0xba, 0x98, 0xe5, - 0x62, 0x1f, 0x71, 0x0c, 0x8b, 0xf6, 0x57, 0x2a, 0xad, 0xd0, - 0xbe, 0xc3, 0x44, 0x39, 0x36, 0x4b, 0xcc, 0xb1, 0xdf, 0xa2, - 0x25, 0x58, 0xf9, 0x84, 0x03, 0x7e, 0x10, 0x6d, 0xea, 0x97, - 0xb5, 0xc8, 0x4f, 0x32, 0x5c, 0x21, 0xa6, 0xdb, 0x7a, 0x07, - 0x80, 0xfd, 0x93, 0xee, 0x69, 0x14, 0x2d, 0x50, 0xd7, 0xaa, - 0xc4, 0xb9, 0x3e, 0x43, 0xe2, 0x9f, 0x18, 0x65, 0x0b, 0x76, - 0xf1, 0x8c, 0xae, 0xd3, 0x54, 0x29, 0x47, 0x3a, 0xbd, 0xc0, - 0x61, 0x1c, 0x9b, 0xe6, 0x88, 0xf5, 0x72, 0x0f, 0x6c, 0x11, - 0x96, 0xeb, 0x85, 0xf8, 0x7f, 0x02, 0xa3, 0xde, 0x59, 0x24, - 0x4a, 0x37, 0xb0, 0xcd, 0xef, 0x92, 0x15, 0x68, 0x06, 0x7b, - 0xfc, 0x81, 0x20, 0x5d, 0xda, 0xa7, 0xc9, 0xb4, 0x33, 0x4e, - 0x77, 0x0a, 0x8d, 0xf0, 0x9e, 0xe3, 0x64, 0x19, 0xb8, 0xc5, - 0x42, 0x3f, 0x51, 0x2c, 0xab, 0xd6, 0xf4, 0x89, 0x0e, 0x73, - 0x1d, 0x60, 0xe7, 0x9a, 0x3b, 0x46, 0xc1, 0xbc, 0xd2, 0xaf, - 0x28, 0x55, 0x5a, 0x27, 0xa0, 0xdd, 0xb3, 0xce, 0x49, 0x34, - 0x95, 0xe8, 0x6f, 0x12, 0x7c, 0x01, 0x86, 0xfb, 0xd9, 0xa4, - 0x23, 0x5e, 0x30, 0x4d, 0xca, 0xb7, 0x16, 0x6b, 0xec, 0x91, - 0xff, 0x82, 0x05, 0x78, 0x41, 0x3c, 0xbb, 0xc6, 0xa8, 0xd5, - 0x52, 0x2f, 0x8e, 0xf3, 0x74, 0x09, 0x67, 0x1a, 0x9d, 0xe0, - 0xc2, 0xbf, 0x38, 0x45, 0x2b, 0x56, 0xd1, 0xac, 0x0d, 0x70, - 0xf7, 0x8a, 0xe4, 0x99, 0x1e, 0x63, 0x00, 0x7e, 0xfc, 0x82, - 0xe5, 0x9b, 0x19, 0x67, 0xd7, 0xa9, 0x2b, 0x55, 0x32, 0x4c, - 0xce, 0xb0, 0xb3, 0xcd, 0x4f, 0x31, 0x56, 0x28, 0xaa, 0xd4, - 0x64, 0x1a, 0x98, 0xe6, 0x81, 0xff, 0x7d, 0x03, 0x7b, 0x05, - 0x87, 0xf9, 0x9e, 0xe0, 0x62, 0x1c, 0xac, 0xd2, 0x50, 0x2e, - 0x49, 0x37, 0xb5, 0xcb, 0xc8, 0xb6, 0x34, 0x4a, 0x2d, 0x53, - 0xd1, 0xaf, 0x1f, 0x61, 0xe3, 0x9d, 0xfa, 0x84, 0x06, 0x78, - 0xf6, 0x88, 0x0a, 0x74, 0x13, 0x6d, 0xef, 0x91, 0x21, 0x5f, - 0xdd, 0xa3, 0xc4, 0xba, 0x38, 0x46, 0x45, 0x3b, 0xb9, 0xc7, - 0xa0, 0xde, 0x5c, 0x22, 0x92, 0xec, 0x6e, 0x10, 0x77, 0x09, - 0x8b, 0xf5, 0x8d, 0xf3, 0x71, 0x0f, 0x68, 0x16, 0x94, 0xea, - 0x5a, 0x24, 0xa6, 0xd8, 0xbf, 0xc1, 0x43, 0x3d, 0x3e, 0x40, - 0xc2, 0xbc, 0xdb, 0xa5, 0x27, 0x59, 0xe9, 0x97, 0x15, 0x6b, - 0x0c, 0x72, 0xf0, 0x8e, 0xf1, 0x8f, 0x0d, 0x73, 0x14, 0x6a, - 0xe8, 0x96, 0x26, 0x58, 0xda, 0xa4, 0xc3, 0xbd, 0x3f, 0x41, - 0x42, 0x3c, 0xbe, 0xc0, 0xa7, 0xd9, 0x5b, 0x25, 0x95, 0xeb, - 0x69, 0x17, 0x70, 0x0e, 0x8c, 0xf2, 0x8a, 0xf4, 0x76, 0x08, - 0x6f, 0x11, 0x93, 0xed, 0x5d, 0x23, 0xa1, 0xdf, 0xb8, 0xc6, - 0x44, 0x3a, 0x39, 0x47, 0xc5, 0xbb, 0xdc, 0xa2, 0x20, 0x5e, - 0xee, 0x90, 0x12, 0x6c, 0x0b, 0x75, 0xf7, 0x89, 0x07, 0x79, - 0xfb, 0x85, 0xe2, 0x9c, 0x1e, 0x60, 0xd0, 0xae, 0x2c, 0x52, - 0x35, 0x4b, 0xc9, 0xb7, 0xb4, 0xca, 0x48, 0x36, 0x51, 0x2f, - 0xad, 0xd3, 0x63, 0x1d, 0x9f, 0xe1, 0x86, 0xf8, 0x7a, 0x04, - 0x7c, 0x02, 0x80, 0xfe, 0x99, 0xe7, 0x65, 0x1b, 0xab, 0xd5, - 0x57, 0x29, 0x4e, 0x30, 0xb2, 0xcc, 0xcf, 0xb1, 0x33, 0x4d, - 0x2a, 0x54, 0xd6, 0xa8, 0x18, 0x66, 0xe4, 0x9a, 0xfd, 0x83, - 0x01, 0x7f, 0x00, 0x7f, 0xfe, 0x81, 0xe1, 0x9e, 0x1f, 0x60, - 0xdf, 0xa0, 0x21, 0x5e, 0x3e, 0x41, 0xc0, 0xbf, 0xa3, 0xdc, - 0x5d, 0x22, 0x42, 0x3d, 0xbc, 0xc3, 0x7c, 0x03, 0x82, 0xfd, - 0x9d, 0xe2, 0x63, 0x1c, 0x5b, 0x24, 0xa5, 0xda, 0xba, 0xc5, - 0x44, 0x3b, 0x84, 0xfb, 0x7a, 0x05, 0x65, 0x1a, 0x9b, 0xe4, - 0xf8, 0x87, 0x06, 0x79, 0x19, 0x66, 0xe7, 0x98, 0x27, 0x58, - 0xd9, 0xa6, 0xc6, 0xb9, 0x38, 0x47, 0xb6, 0xc9, 0x48, 0x37, - 0x57, 0x28, 0xa9, 0xd6, 0x69, 0x16, 0x97, 0xe8, 0x88, 0xf7, - 0x76, 0x09, 0x15, 0x6a, 0xeb, 0x94, 0xf4, 0x8b, 0x0a, 0x75, - 0xca, 0xb5, 0x34, 0x4b, 0x2b, 0x54, 0xd5, 0xaa, 0xed, 0x92, - 0x13, 0x6c, 0x0c, 0x73, 0xf2, 0x8d, 0x32, 0x4d, 0xcc, 0xb3, - 0xd3, 0xac, 0x2d, 0x52, 0x4e, 0x31, 0xb0, 0xcf, 0xaf, 0xd0, - 0x51, 0x2e, 0x91, 0xee, 0x6f, 0x10, 0x70, 0x0f, 0x8e, 0xf1, - 0x71, 0x0e, 0x8f, 0xf0, 0x90, 0xef, 0x6e, 0x11, 0xae, 0xd1, - 0x50, 0x2f, 0x4f, 0x30, 0xb1, 0xce, 0xd2, 0xad, 0x2c, 0x53, - 0x33, 0x4c, 0xcd, 0xb2, 0x0d, 0x72, 0xf3, 0x8c, 0xec, 0x93, - 0x12, 0x6d, 0x2a, 0x55, 0xd4, 0xab, 0xcb, 0xb4, 0x35, 0x4a, - 0xf5, 0x8a, 0x0b, 0x74, 0x14, 0x6b, 0xea, 0x95, 0x89, 0xf6, - 0x77, 0x08, 0x68, 0x17, 0x96, 0xe9, 0x56, 0x29, 0xa8, 0xd7, - 0xb7, 0xc8, 0x49, 0x36, 0xc7, 0xb8, 0x39, 0x46, 0x26, 0x59, - 0xd8, 0xa7, 0x18, 0x67, 0xe6, 0x99, 0xf9, 0x86, 0x07, 0x78, - 0x64, 0x1b, 0x9a, 0xe5, 0x85, 0xfa, 0x7b, 0x04, 0xbb, 0xc4, - 0x45, 0x3a, 0x5a, 0x25, 0xa4, 0xdb, 0x9c, 0xe3, 0x62, 0x1d, - 0x7d, 0x02, 0x83, 0xfc, 0x43, 0x3c, 0xbd, 0xc2, 0xa2, 0xdd, - 0x5c, 0x23, 0x3f, 0x40, 0xc1, 0xbe, 0xde, 0xa1, 0x20, 0x5f, - 0xe0, 0x9f, 0x1e, 0x61, 0x01, 0x7e, 0xff, 0x80, 0x00, 0x80, - 0x1d, 0x9d, 0x3a, 0xba, 0x27, 0xa7, 0x74, 0xf4, 0x69, 0xe9, - 0x4e, 0xce, 0x53, 0xd3, 0xe8, 0x68, 0xf5, 0x75, 0xd2, 0x52, - 0xcf, 0x4f, 0x9c, 0x1c, 0x81, 0x01, 0xa6, 0x26, 0xbb, 0x3b, - 0xcd, 0x4d, 0xd0, 0x50, 0xf7, 0x77, 0xea, 0x6a, 0xb9, 0x39, - 0xa4, 0x24, 0x83, 0x03, 0x9e, 0x1e, 0x25, 0xa5, 0x38, 0xb8, - 0x1f, 0x9f, 0x02, 0x82, 0x51, 0xd1, 0x4c, 0xcc, 0x6b, 0xeb, - 0x76, 0xf6, 0x87, 0x07, 0x9a, 0x1a, 0xbd, 0x3d, 0xa0, 0x20, - 0xf3, 0x73, 0xee, 0x6e, 0xc9, 0x49, 0xd4, 0x54, 0x6f, 0xef, - 0x72, 0xf2, 0x55, 0xd5, 0x48, 0xc8, 0x1b, 0x9b, 0x06, 0x86, - 0x21, 0xa1, 0x3c, 0xbc, 0x4a, 0xca, 0x57, 0xd7, 0x70, 0xf0, - 0x6d, 0xed, 0x3e, 0xbe, 0x23, 0xa3, 0x04, 0x84, 0x19, 0x99, - 0xa2, 0x22, 0xbf, 0x3f, 0x98, 0x18, 0x85, 0x05, 0xd6, 0x56, - 0xcb, 0x4b, 0xec, 0x6c, 0xf1, 0x71, 0x13, 0x93, 0x0e, 0x8e, - 0x29, 0xa9, 0x34, 0xb4, 0x67, 0xe7, 0x7a, 0xfa, 0x5d, 0xdd, - 0x40, 0xc0, 0xfb, 0x7b, 0xe6, 0x66, 0xc1, 0x41, 0xdc, 0x5c, - 0x8f, 0x0f, 0x92, 0x12, 0xb5, 0x35, 0xa8, 0x28, 0xde, 0x5e, - 0xc3, 0x43, 0xe4, 0x64, 0xf9, 0x79, 0xaa, 0x2a, 0xb7, 0x37, - 0x90, 0x10, 0x8d, 0x0d, 0x36, 0xb6, 0x2b, 0xab, 0x0c, 0x8c, - 0x11, 0x91, 0x42, 0xc2, 0x5f, 0xdf, 0x78, 0xf8, 0x65, 0xe5, - 0x94, 0x14, 0x89, 0x09, 0xae, 0x2e, 0xb3, 0x33, 0xe0, 0x60, - 0xfd, 0x7d, 0xda, 0x5a, 0xc7, 0x47, 0x7c, 0xfc, 0x61, 0xe1, - 0x46, 0xc6, 0x5b, 0xdb, 0x08, 0x88, 0x15, 0x95, 0x32, 0xb2, - 0x2f, 0xaf, 0x59, 0xd9, 0x44, 0xc4, 0x63, 0xe3, 0x7e, 0xfe, - 0x2d, 0xad, 0x30, 0xb0, 0x17, 0x97, 0x0a, 0x8a, 0xb1, 0x31, - 0xac, 0x2c, 0x8b, 0x0b, 0x96, 0x16, 0xc5, 0x45, 0xd8, 0x58, - 0xff, 0x7f, 0xe2, 0x62, 0x00, 0x81, 0x1f, 0x9e, 0x3e, 0xbf, - 0x21, 0xa0, 0x7c, 0xfd, 0x63, 0xe2, 0x42, 0xc3, 0x5d, 0xdc, - 0xf8, 0x79, 0xe7, 0x66, 0xc6, 0x47, 0xd9, 0x58, 0x84, 0x05, - 0x9b, 0x1a, 0xba, 0x3b, 0xa5, 0x24, 0xed, 0x6c, 0xf2, 0x73, - 0xd3, 0x52, 0xcc, 0x4d, 0x91, 0x10, 0x8e, 0x0f, 0xaf, 0x2e, - 0xb0, 0x31, 0x15, 0x94, 0x0a, 0x8b, 0x2b, 0xaa, 0x34, 0xb5, - 0x69, 0xe8, 0x76, 0xf7, 0x57, 0xd6, 0x48, 0xc9, 0xc7, 0x46, - 0xd8, 0x59, 0xf9, 0x78, 0xe6, 0x67, 0xbb, 0x3a, 0xa4, 0x25, - 0x85, 0x04, 0x9a, 0x1b, 0x3f, 0xbe, 0x20, 0xa1, 0x01, 0x80, - 0x1e, 0x9f, 0x43, 0xc2, 0x5c, 0xdd, 0x7d, 0xfc, 0x62, 0xe3, - 0x2a, 0xab, 0x35, 0xb4, 0x14, 0x95, 0x0b, 0x8a, 0x56, 0xd7, - 0x49, 0xc8, 0x68, 0xe9, 0x77, 0xf6, 0xd2, 0x53, 0xcd, 0x4c, - 0xec, 0x6d, 0xf3, 0x72, 0xae, 0x2f, 0xb1, 0x30, 0x90, 0x11, - 0x8f, 0x0e, 0x93, 0x12, 0x8c, 0x0d, 0xad, 0x2c, 0xb2, 0x33, - 0xef, 0x6e, 0xf0, 0x71, 0xd1, 0x50, 0xce, 0x4f, 0x6b, 0xea, - 0x74, 0xf5, 0x55, 0xd4, 0x4a, 0xcb, 0x17, 0x96, 0x08, 0x89, - 0x29, 0xa8, 0x36, 0xb7, 0x7e, 0xff, 0x61, 0xe0, 0x40, 0xc1, - 0x5f, 0xde, 0x02, 0x83, 0x1d, 0x9c, 0x3c, 0xbd, 0x23, 0xa2, - 0x86, 0x07, 0x99, 0x18, 0xb8, 0x39, 0xa7, 0x26, 0xfa, 0x7b, - 0xe5, 0x64, 0xc4, 0x45, 0xdb, 0x5a, 0x54, 0xd5, 0x4b, 0xca, - 0x6a, 0xeb, 0x75, 0xf4, 0x28, 0xa9, 0x37, 0xb6, 0x16, 0x97, - 0x09, 0x88, 0xac, 0x2d, 0xb3, 0x32, 0x92, 0x13, 0x8d, 0x0c, - 0xd0, 0x51, 0xcf, 0x4e, 0xee, 0x6f, 0xf1, 0x70, 0xb9, 0x38, - 0xa6, 0x27, 0x87, 0x06, 0x98, 0x19, 0xc5, 0x44, 0xda, 0x5b, - 0xfb, 0x7a, 0xe4, 0x65, 0x41, 0xc0, 0x5e, 0xdf, 0x7f, 0xfe, - 0x60, 0xe1, 0x3d, 0xbc, 0x22, 0xa3, 0x03, 0x82, 0x1c, 0x9d, - 0x00, 0x82, 0x19, 0x9b, 0x32, 0xb0, 0x2b, 0xa9, 0x64, 0xe6, - 0x7d, 0xff, 0x56, 0xd4, 0x4f, 0xcd, 0xc8, 0x4a, 0xd1, 0x53, - 0xfa, 0x78, 0xe3, 0x61, 0xac, 0x2e, 0xb5, 0x37, 0x9e, 0x1c, - 0x87, 0x05, 0x8d, 0x0f, 0x94, 0x16, 0xbf, 0x3d, 0xa6, 0x24, - 0xe9, 0x6b, 0xf0, 0x72, 0xdb, 0x59, 0xc2, 0x40, 0x45, 0xc7, - 0x5c, 0xde, 0x77, 0xf5, 0x6e, 0xec, 0x21, 0xa3, 0x38, 0xba, - 0x13, 0x91, 0x0a, 0x88, 0x07, 0x85, 0x1e, 0x9c, 0x35, 0xb7, - 0x2c, 0xae, 0x63, 0xe1, 0x7a, 0xf8, 0x51, 0xd3, 0x48, 0xca, - 0xcf, 0x4d, 0xd6, 0x54, 0xfd, 0x7f, 0xe4, 0x66, 0xab, 0x29, - 0xb2, 0x30, 0x99, 0x1b, 0x80, 0x02, 0x8a, 0x08, 0x93, 0x11, - 0xb8, 0x3a, 0xa1, 0x23, 0xee, 0x6c, 0xf7, 0x75, 0xdc, 0x5e, - 0xc5, 0x47, 0x42, 0xc0, 0x5b, 0xd9, 0x70, 0xf2, 0x69, 0xeb, - 0x26, 0xa4, 0x3f, 0xbd, 0x14, 0x96, 0x0d, 0x8f, 0x0e, 0x8c, - 0x17, 0x95, 0x3c, 0xbe, 0x25, 0xa7, 0x6a, 0xe8, 0x73, 0xf1, - 0x58, 0xda, 0x41, 0xc3, 0xc6, 0x44, 0xdf, 0x5d, 0xf4, 0x76, - 0xed, 0x6f, 0xa2, 0x20, 0xbb, 0x39, 0x90, 0x12, 0x89, 0x0b, - 0x83, 0x01, 0x9a, 0x18, 0xb1, 0x33, 0xa8, 0x2a, 0xe7, 0x65, - 0xfe, 0x7c, 0xd5, 0x57, 0xcc, 0x4e, 0x4b, 0xc9, 0x52, 0xd0, - 0x79, 0xfb, 0x60, 0xe2, 0x2f, 0xad, 0x36, 0xb4, 0x1d, 0x9f, - 0x04, 0x86, 0x09, 0x8b, 0x10, 0x92, 0x3b, 0xb9, 0x22, 0xa0, - 0x6d, 0xef, 0x74, 0xf6, 0x5f, 0xdd, 0x46, 0xc4, 0xc1, 0x43, - 0xd8, 0x5a, 0xf3, 0x71, 0xea, 0x68, 0xa5, 0x27, 0xbc, 0x3e, - 0x97, 0x15, 0x8e, 0x0c, 0x84, 0x06, 0x9d, 0x1f, 0xb6, 0x34, - 0xaf, 0x2d, 0xe0, 0x62, 0xf9, 0x7b, 0xd2, 0x50, 0xcb, 0x49, - 0x4c, 0xce, 0x55, 0xd7, 0x7e, 0xfc, 0x67, 0xe5, 0x28, 0xaa, - 0x31, 0xb3, 0x1a, 0x98, 0x03, 0x81, 0x00, 0x83, 0x1b, 0x98, - 0x36, 0xb5, 0x2d, 0xae, 0x6c, 0xef, 0x77, 0xf4, 0x5a, 0xd9, - 0x41, 0xc2, 0xd8, 0x5b, 0xc3, 0x40, 0xee, 0x6d, 0xf5, 0x76, - 0xb4, 0x37, 0xaf, 0x2c, 0x82, 0x01, 0x99, 0x1a, 0xad, 0x2e, - 0xb6, 0x35, 0x9b, 0x18, 0x80, 0x03, 0xc1, 0x42, 0xda, 0x59, - 0xf7, 0x74, 0xec, 0x6f, 0x75, 0xf6, 0x6e, 0xed, 0x43, 0xc0, - 0x58, 0xdb, 0x19, 0x9a, 0x02, 0x81, 0x2f, 0xac, 0x34, 0xb7, - 0x47, 0xc4, 0x5c, 0xdf, 0x71, 0xf2, 0x6a, 0xe9, 0x2b, 0xa8, - 0x30, 0xb3, 0x1d, 0x9e, 0x06, 0x85, 0x9f, 0x1c, 0x84, 0x07, - 0xa9, 0x2a, 0xb2, 0x31, 0xf3, 0x70, 0xe8, 0x6b, 0xc5, 0x46, - 0xde, 0x5d, 0xea, 0x69, 0xf1, 0x72, 0xdc, 0x5f, 0xc7, 0x44, - 0x86, 0x05, 0x9d, 0x1e, 0xb0, 0x33, 0xab, 0x28, 0x32, 0xb1, - 0x29, 0xaa, 0x04, 0x87, 0x1f, 0x9c, 0x5e, 0xdd, 0x45, 0xc6, - 0x68, 0xeb, 0x73, 0xf0, 0x8e, 0x0d, 0x95, 0x16, 0xb8, 0x3b, - 0xa3, 0x20, 0xe2, 0x61, 0xf9, 0x7a, 0xd4, 0x57, 0xcf, 0x4c, - 0x56, 0xd5, 0x4d, 0xce, 0x60, 0xe3, 0x7b, 0xf8, 0x3a, 0xb9, - 0x21, 0xa2, 0x0c, 0x8f, 0x17, 0x94, 0x23, 0xa0, 0x38, 0xbb, - 0x15, 0x96, 0x0e, 0x8d, 0x4f, 0xcc, 0x54, 0xd7, 0x79, 0xfa, - 0x62, 0xe1, 0xfb, 0x78, 0xe0, 0x63, 0xcd, 0x4e, 0xd6, 0x55, - 0x97, 0x14, 0x8c, 0x0f, 0xa1, 0x22, 0xba, 0x39, 0xc9, 0x4a, - 0xd2, 0x51, 0xff, 0x7c, 0xe4, 0x67, 0xa5, 0x26, 0xbe, 0x3d, - 0x93, 0x10, 0x88, 0x0b, 0x11, 0x92, 0x0a, 0x89, 0x27, 0xa4, - 0x3c, 0xbf, 0x7d, 0xfe, 0x66, 0xe5, 0x4b, 0xc8, 0x50, 0xd3, - 0x64, 0xe7, 0x7f, 0xfc, 0x52, 0xd1, 0x49, 0xca, 0x08, 0x8b, - 0x13, 0x90, 0x3e, 0xbd, 0x25, 0xa6, 0xbc, 0x3f, 0xa7, 0x24, - 0x8a, 0x09, 0x91, 0x12, 0xd0, 0x53, 0xcb, 0x48, 0xe6, 0x65, - 0xfd, 0x7e, 0x00, 0x84, 0x15, 0x91, 0x2a, 0xae, 0x3f, 0xbb, - 0x54, 0xd0, 0x41, 0xc5, 0x7e, 0xfa, 0x6b, 0xef, 0xa8, 0x2c, - 0xbd, 0x39, 0x82, 0x06, 0x97, 0x13, 0xfc, 0x78, 0xe9, 0x6d, - 0xd6, 0x52, 0xc3, 0x47, 0x4d, 0xc9, 0x58, 0xdc, 0x67, 0xe3, - 0x72, 0xf6, 0x19, 0x9d, 0x0c, 0x88, 0x33, 0xb7, 0x26, 0xa2, - 0xe5, 0x61, 0xf0, 0x74, 0xcf, 0x4b, 0xda, 0x5e, 0xb1, 0x35, - 0xa4, 0x20, 0x9b, 0x1f, 0x8e, 0x0a, 0x9a, 0x1e, 0x8f, 0x0b, - 0xb0, 0x34, 0xa5, 0x21, 0xce, 0x4a, 0xdb, 0x5f, 0xe4, 0x60, - 0xf1, 0x75, 0x32, 0xb6, 0x27, 0xa3, 0x18, 0x9c, 0x0d, 0x89, - 0x66, 0xe2, 0x73, 0xf7, 0x4c, 0xc8, 0x59, 0xdd, 0xd7, 0x53, - 0xc2, 0x46, 0xfd, 0x79, 0xe8, 0x6c, 0x83, 0x07, 0x96, 0x12, - 0xa9, 0x2d, 0xbc, 0x38, 0x7f, 0xfb, 0x6a, 0xee, 0x55, 0xd1, - 0x40, 0xc4, 0x2b, 0xaf, 0x3e, 0xba, 0x01, 0x85, 0x14, 0x90, - 0x29, 0xad, 0x3c, 0xb8, 0x03, 0x87, 0x16, 0x92, 0x7d, 0xf9, - 0x68, 0xec, 0x57, 0xd3, 0x42, 0xc6, 0x81, 0x05, 0x94, 0x10, - 0xab, 0x2f, 0xbe, 0x3a, 0xd5, 0x51, 0xc0, 0x44, 0xff, 0x7b, - 0xea, 0x6e, 0x64, 0xe0, 0x71, 0xf5, 0x4e, 0xca, 0x5b, 0xdf, - 0x30, 0xb4, 0x25, 0xa1, 0x1a, 0x9e, 0x0f, 0x8b, 0xcc, 0x48, - 0xd9, 0x5d, 0xe6, 0x62, 0xf3, 0x77, 0x98, 0x1c, 0x8d, 0x09, - 0xb2, 0x36, 0xa7, 0x23, 0xb3, 0x37, 0xa6, 0x22, 0x99, 0x1d, - 0x8c, 0x08, 0xe7, 0x63, 0xf2, 0x76, 0xcd, 0x49, 0xd8, 0x5c, - 0x1b, 0x9f, 0x0e, 0x8a, 0x31, 0xb5, 0x24, 0xa0, 0x4f, 0xcb, - 0x5a, 0xde, 0x65, 0xe1, 0x70, 0xf4, 0xfe, 0x7a, 0xeb, 0x6f, - 0xd4, 0x50, 0xc1, 0x45, 0xaa, 0x2e, 0xbf, 0x3b, 0x80, 0x04, - 0x95, 0x11, 0x56, 0xd2, 0x43, 0xc7, 0x7c, 0xf8, 0x69, 0xed, - 0x02, 0x86, 0x17, 0x93, 0x28, 0xac, 0x3d, 0xb9, 0x00, 0x85, - 0x17, 0x92, 0x2e, 0xab, 0x39, 0xbc, 0x5c, 0xd9, 0x4b, 0xce, - 0x72, 0xf7, 0x65, 0xe0, 0xb8, 0x3d, 0xaf, 0x2a, 0x96, 0x13, - 0x81, 0x04, 0xe4, 0x61, 0xf3, 0x76, 0xca, 0x4f, 0xdd, 0x58, - 0x6d, 0xe8, 0x7a, 0xff, 0x43, 0xc6, 0x54, 0xd1, 0x31, 0xb4, - 0x26, 0xa3, 0x1f, 0x9a, 0x08, 0x8d, 0xd5, 0x50, 0xc2, 0x47, - 0xfb, 0x7e, 0xec, 0x69, 0x89, 0x0c, 0x9e, 0x1b, 0xa7, 0x22, - 0xb0, 0x35, 0xda, 0x5f, 0xcd, 0x48, 0xf4, 0x71, 0xe3, 0x66, - 0x86, 0x03, 0x91, 0x14, 0xa8, 0x2d, 0xbf, 0x3a, 0x62, 0xe7, - 0x75, 0xf0, 0x4c, 0xc9, 0x5b, 0xde, 0x3e, 0xbb, 0x29, 0xac, - 0x10, 0x95, 0x07, 0x82, 0xb7, 0x32, 0xa0, 0x25, 0x99, 0x1c, - 0x8e, 0x0b, 0xeb, 0x6e, 0xfc, 0x79, 0xc5, 0x40, 0xd2, 0x57, - 0x0f, 0x8a, 0x18, 0x9d, 0x21, 0xa4, 0x36, 0xb3, 0x53, 0xd6, - 0x44, 0xc1, 0x7d, 0xf8, 0x6a, 0xef, 0xa9, 0x2c, 0xbe, 0x3b, - 0x87, 0x02, 0x90, 0x15, 0xf5, 0x70, 0xe2, 0x67, 0xdb, 0x5e, - 0xcc, 0x49, 0x11, 0x94, 0x06, 0x83, 0x3f, 0xba, 0x28, 0xad, - 0x4d, 0xc8, 0x5a, 0xdf, 0x63, 0xe6, 0x74, 0xf1, 0xc4, 0x41, - 0xd3, 0x56, 0xea, 0x6f, 0xfd, 0x78, 0x98, 0x1d, 0x8f, 0x0a, - 0xb6, 0x33, 0xa1, 0x24, 0x7c, 0xf9, 0x6b, 0xee, 0x52, 0xd7, - 0x45, 0xc0, 0x20, 0xa5, 0x37, 0xb2, 0x0e, 0x8b, 0x19, 0x9c, - 0x73, 0xf6, 0x64, 0xe1, 0x5d, 0xd8, 0x4a, 0xcf, 0x2f, 0xaa, - 0x38, 0xbd, 0x01, 0x84, 0x16, 0x93, 0xcb, 0x4e, 0xdc, 0x59, - 0xe5, 0x60, 0xf2, 0x77, 0x97, 0x12, 0x80, 0x05, 0xb9, 0x3c, - 0xae, 0x2b, 0x1e, 0x9b, 0x09, 0x8c, 0x30, 0xb5, 0x27, 0xa2, - 0x42, 0xc7, 0x55, 0xd0, 0x6c, 0xe9, 0x7b, 0xfe, 0xa6, 0x23, - 0xb1, 0x34, 0x88, 0x0d, 0x9f, 0x1a, 0xfa, 0x7f, 0xed, 0x68, - 0xd4, 0x51, 0xc3, 0x46, 0x00, 0x86, 0x11, 0x97, 0x22, 0xa4, - 0x33, 0xb5, 0x44, 0xc2, 0x55, 0xd3, 0x66, 0xe0, 0x77, 0xf1, - 0x88, 0x0e, 0x99, 0x1f, 0xaa, 0x2c, 0xbb, 0x3d, 0xcc, 0x4a, - 0xdd, 0x5b, 0xee, 0x68, 0xff, 0x79, 0x0d, 0x8b, 0x1c, 0x9a, - 0x2f, 0xa9, 0x3e, 0xb8, 0x49, 0xcf, 0x58, 0xde, 0x6b, 0xed, - 0x7a, 0xfc, 0x85, 0x03, 0x94, 0x12, 0xa7, 0x21, 0xb6, 0x30, - 0xc1, 0x47, 0xd0, 0x56, 0xe3, 0x65, 0xf2, 0x74, 0x1a, 0x9c, - 0x0b, 0x8d, 0x38, 0xbe, 0x29, 0xaf, 0x5e, 0xd8, 0x4f, 0xc9, - 0x7c, 0xfa, 0x6d, 0xeb, 0x92, 0x14, 0x83, 0x05, 0xb0, 0x36, - 0xa1, 0x27, 0xd6, 0x50, 0xc7, 0x41, 0xf4, 0x72, 0xe5, 0x63, - 0x17, 0x91, 0x06, 0x80, 0x35, 0xb3, 0x24, 0xa2, 0x53, 0xd5, - 0x42, 0xc4, 0x71, 0xf7, 0x60, 0xe6, 0x9f, 0x19, 0x8e, 0x08, - 0xbd, 0x3b, 0xac, 0x2a, 0xdb, 0x5d, 0xca, 0x4c, 0xf9, 0x7f, - 0xe8, 0x6e, 0x34, 0xb2, 0x25, 0xa3, 0x16, 0x90, 0x07, 0x81, - 0x70, 0xf6, 0x61, 0xe7, 0x52, 0xd4, 0x43, 0xc5, 0xbc, 0x3a, - 0xad, 0x2b, 0x9e, 0x18, 0x8f, 0x09, 0xf8, 0x7e, 0xe9, 0x6f, - 0xda, 0x5c, 0xcb, 0x4d, 0x39, 0xbf, 0x28, 0xae, 0x1b, 0x9d, - 0x0a, 0x8c, 0x7d, 0xfb, 0x6c, 0xea, 0x5f, 0xd9, 0x4e, 0xc8, - 0xb1, 0x37, 0xa0, 0x26, 0x93, 0x15, 0x82, 0x04, 0xf5, 0x73, - 0xe4, 0x62, 0xd7, 0x51, 0xc6, 0x40, 0x2e, 0xa8, 0x3f, 0xb9, - 0x0c, 0x8a, 0x1d, 0x9b, 0x6a, 0xec, 0x7b, 0xfd, 0x48, 0xce, - 0x59, 0xdf, 0xa6, 0x20, 0xb7, 0x31, 0x84, 0x02, 0x95, 0x13, - 0xe2, 0x64, 0xf3, 0x75, 0xc0, 0x46, 0xd1, 0x57, 0x23, 0xa5, - 0x32, 0xb4, 0x01, 0x87, 0x10, 0x96, 0x67, 0xe1, 0x76, 0xf0, - 0x45, 0xc3, 0x54, 0xd2, 0xab, 0x2d, 0xba, 0x3c, 0x89, 0x0f, - 0x98, 0x1e, 0xef, 0x69, 0xfe, 0x78, 0xcd, 0x4b, 0xdc, 0x5a, - 0x00, 0x87, 0x13, 0x94, 0x26, 0xa1, 0x35, 0xb2, 0x4c, 0xcb, - 0x5f, 0xd8, 0x6a, 0xed, 0x79, 0xfe, 0x98, 0x1f, 0x8b, 0x0c, - 0xbe, 0x39, 0xad, 0x2a, 0xd4, 0x53, 0xc7, 0x40, 0xf2, 0x75, - 0xe1, 0x66, 0x2d, 0xaa, 0x3e, 0xb9, 0x0b, 0x8c, 0x18, 0x9f, - 0x61, 0xe6, 0x72, 0xf5, 0x47, 0xc0, 0x54, 0xd3, 0xb5, 0x32, - 0xa6, 0x21, 0x93, 0x14, 0x80, 0x07, 0xf9, 0x7e, 0xea, 0x6d, - 0xdf, 0x58, 0xcc, 0x4b, 0x5a, 0xdd, 0x49, 0xce, 0x7c, 0xfb, - 0x6f, 0xe8, 0x16, 0x91, 0x05, 0x82, 0x30, 0xb7, 0x23, 0xa4, - 0xc2, 0x45, 0xd1, 0x56, 0xe4, 0x63, 0xf7, 0x70, 0x8e, 0x09, - 0x9d, 0x1a, 0xa8, 0x2f, 0xbb, 0x3c, 0x77, 0xf0, 0x64, 0xe3, - 0x51, 0xd6, 0x42, 0xc5, 0x3b, 0xbc, 0x28, 0xaf, 0x1d, 0x9a, - 0x0e, 0x89, 0xef, 0x68, 0xfc, 0x7b, 0xc9, 0x4e, 0xda, 0x5d, - 0xa3, 0x24, 0xb0, 0x37, 0x85, 0x02, 0x96, 0x11, 0xb4, 0x33, - 0xa7, 0x20, 0x92, 0x15, 0x81, 0x06, 0xf8, 0x7f, 0xeb, 0x6c, - 0xde, 0x59, 0xcd, 0x4a, 0x2c, 0xab, 0x3f, 0xb8, 0x0a, 0x8d, - 0x19, 0x9e, 0x60, 0xe7, 0x73, 0xf4, 0x46, 0xc1, 0x55, 0xd2, - 0x99, 0x1e, 0x8a, 0x0d, 0xbf, 0x38, 0xac, 0x2b, 0xd5, 0x52, - 0xc6, 0x41, 0xf3, 0x74, 0xe0, 0x67, 0x01, 0x86, 0x12, 0x95, - 0x27, 0xa0, 0x34, 0xb3, 0x4d, 0xca, 0x5e, 0xd9, 0x6b, 0xec, - 0x78, 0xff, 0xee, 0x69, 0xfd, 0x7a, 0xc8, 0x4f, 0xdb, 0x5c, - 0xa2, 0x25, 0xb1, 0x36, 0x84, 0x03, 0x97, 0x10, 0x76, 0xf1, - 0x65, 0xe2, 0x50, 0xd7, 0x43, 0xc4, 0x3a, 0xbd, 0x29, 0xae, - 0x1c, 0x9b, 0x0f, 0x88, 0xc3, 0x44, 0xd0, 0x57, 0xe5, 0x62, - 0xf6, 0x71, 0x8f, 0x08, 0x9c, 0x1b, 0xa9, 0x2e, 0xba, 0x3d, - 0x5b, 0xdc, 0x48, 0xcf, 0x7d, 0xfa, 0x6e, 0xe9, 0x17, 0x90, - 0x04, 0x83, 0x31, 0xb6, 0x22, 0xa5, 0x00, 0x88, 0x0d, 0x85, - 0x1a, 0x92, 0x17, 0x9f, 0x34, 0xbc, 0x39, 0xb1, 0x2e, 0xa6, - 0x23, 0xab, 0x68, 0xe0, 0x65, 0xed, 0x72, 0xfa, 0x7f, 0xf7, - 0x5c, 0xd4, 0x51, 0xd9, 0x46, 0xce, 0x4b, 0xc3, 0xd0, 0x58, - 0xdd, 0x55, 0xca, 0x42, 0xc7, 0x4f, 0xe4, 0x6c, 0xe9, 0x61, - 0xfe, 0x76, 0xf3, 0x7b, 0xb8, 0x30, 0xb5, 0x3d, 0xa2, 0x2a, - 0xaf, 0x27, 0x8c, 0x04, 0x81, 0x09, 0x96, 0x1e, 0x9b, 0x13, - 0xbd, 0x35, 0xb0, 0x38, 0xa7, 0x2f, 0xaa, 0x22, 0x89, 0x01, - 0x84, 0x0c, 0x93, 0x1b, 0x9e, 0x16, 0xd5, 0x5d, 0xd8, 0x50, - 0xcf, 0x47, 0xc2, 0x4a, 0xe1, 0x69, 0xec, 0x64, 0xfb, 0x73, - 0xf6, 0x7e, 0x6d, 0xe5, 0x60, 0xe8, 0x77, 0xff, 0x7a, 0xf2, - 0x59, 0xd1, 0x54, 0xdc, 0x43, 0xcb, 0x4e, 0xc6, 0x05, 0x8d, - 0x08, 0x80, 0x1f, 0x97, 0x12, 0x9a, 0x31, 0xb9, 0x3c, 0xb4, - 0x2b, 0xa3, 0x26, 0xae, 0x67, 0xef, 0x6a, 0xe2, 0x7d, 0xf5, - 0x70, 0xf8, 0x53, 0xdb, 0x5e, 0xd6, 0x49, 0xc1, 0x44, 0xcc, - 0x0f, 0x87, 0x02, 0x8a, 0x15, 0x9d, 0x18, 0x90, 0x3b, 0xb3, - 0x36, 0xbe, 0x21, 0xa9, 0x2c, 0xa4, 0xb7, 0x3f, 0xba, 0x32, - 0xad, 0x25, 0xa0, 0x28, 0x83, 0x0b, 0x8e, 0x06, 0x99, 0x11, - 0x94, 0x1c, 0xdf, 0x57, 0xd2, 0x5a, 0xc5, 0x4d, 0xc8, 0x40, - 0xeb, 0x63, 0xe6, 0x6e, 0xf1, 0x79, 0xfc, 0x74, 0xda, 0x52, - 0xd7, 0x5f, 0xc0, 0x48, 0xcd, 0x45, 0xee, 0x66, 0xe3, 0x6b, - 0xf4, 0x7c, 0xf9, 0x71, 0xb2, 0x3a, 0xbf, 0x37, 0xa8, 0x20, - 0xa5, 0x2d, 0x86, 0x0e, 0x8b, 0x03, 0x9c, 0x14, 0x91, 0x19, - 0x0a, 0x82, 0x07, 0x8f, 0x10, 0x98, 0x1d, 0x95, 0x3e, 0xb6, - 0x33, 0xbb, 0x24, 0xac, 0x29, 0xa1, 0x62, 0xea, 0x6f, 0xe7, - 0x78, 0xf0, 0x75, 0xfd, 0x56, 0xde, 0x5b, 0xd3, 0x4c, 0xc4, - 0x41, 0xc9, 0x00, 0x89, 0x0f, 0x86, 0x1e, 0x97, 0x11, 0x98, - 0x3c, 0xb5, 0x33, 0xba, 0x22, 0xab, 0x2d, 0xa4, 0x78, 0xf1, - 0x77, 0xfe, 0x66, 0xef, 0x69, 0xe0, 0x44, 0xcd, 0x4b, 0xc2, - 0x5a, 0xd3, 0x55, 0xdc, 0xf0, 0x79, 0xff, 0x76, 0xee, 0x67, - 0xe1, 0x68, 0xcc, 0x45, 0xc3, 0x4a, 0xd2, 0x5b, 0xdd, 0x54, - 0x88, 0x01, 0x87, 0x0e, 0x96, 0x1f, 0x99, 0x10, 0xb4, 0x3d, - 0xbb, 0x32, 0xaa, 0x23, 0xa5, 0x2c, 0xfd, 0x74, 0xf2, 0x7b, - 0xe3, 0x6a, 0xec, 0x65, 0xc1, 0x48, 0xce, 0x47, 0xdf, 0x56, - 0xd0, 0x59, 0x85, 0x0c, 0x8a, 0x03, 0x9b, 0x12, 0x94, 0x1d, - 0xb9, 0x30, 0xb6, 0x3f, 0xa7, 0x2e, 0xa8, 0x21, 0x0d, 0x84, - 0x02, 0x8b, 0x13, 0x9a, 0x1c, 0x95, 0x31, 0xb8, 0x3e, 0xb7, - 0x2f, 0xa6, 0x20, 0xa9, 0x75, 0xfc, 0x7a, 0xf3, 0x6b, 0xe2, - 0x64, 0xed, 0x49, 0xc0, 0x46, 0xcf, 0x57, 0xde, 0x58, 0xd1, - 0xe7, 0x6e, 0xe8, 0x61, 0xf9, 0x70, 0xf6, 0x7f, 0xdb, 0x52, - 0xd4, 0x5d, 0xc5, 0x4c, 0xca, 0x43, 0x9f, 0x16, 0x90, 0x19, - 0x81, 0x08, 0x8e, 0x07, 0xa3, 0x2a, 0xac, 0x25, 0xbd, 0x34, - 0xb2, 0x3b, 0x17, 0x9e, 0x18, 0x91, 0x09, 0x80, 0x06, 0x8f, - 0x2b, 0xa2, 0x24, 0xad, 0x35, 0xbc, 0x3a, 0xb3, 0x6f, 0xe6, - 0x60, 0xe9, 0x71, 0xf8, 0x7e, 0xf7, 0x53, 0xda, 0x5c, 0xd5, - 0x4d, 0xc4, 0x42, 0xcb, 0x1a, 0x93, 0x15, 0x9c, 0x04, 0x8d, - 0x0b, 0x82, 0x26, 0xaf, 0x29, 0xa0, 0x38, 0xb1, 0x37, 0xbe, - 0x62, 0xeb, 0x6d, 0xe4, 0x7c, 0xf5, 0x73, 0xfa, 0x5e, 0xd7, - 0x51, 0xd8, 0x40, 0xc9, 0x4f, 0xc6, 0xea, 0x63, 0xe5, 0x6c, - 0xf4, 0x7d, 0xfb, 0x72, 0xd6, 0x5f, 0xd9, 0x50, 0xc8, 0x41, - 0xc7, 0x4e, 0x92, 0x1b, 0x9d, 0x14, 0x8c, 0x05, 0x83, 0x0a, - 0xae, 0x27, 0xa1, 0x28, 0xb0, 0x39, 0xbf, 0x36, 0x00, 0x8a, - 0x09, 0x83, 0x12, 0x98, 0x1b, 0x91, 0x24, 0xae, 0x2d, 0xa7, - 0x36, 0xbc, 0x3f, 0xb5, 0x48, 0xc2, 0x41, 0xcb, 0x5a, 0xd0, - 0x53, 0xd9, 0x6c, 0xe6, 0x65, 0xef, 0x7e, 0xf4, 0x77, 0xfd, - 0x90, 0x1a, 0x99, 0x13, 0x82, 0x08, 0x8b, 0x01, 0xb4, 0x3e, - 0xbd, 0x37, 0xa6, 0x2c, 0xaf, 0x25, 0xd8, 0x52, 0xd1, 0x5b, - 0xca, 0x40, 0xc3, 0x49, 0xfc, 0x76, 0xf5, 0x7f, 0xee, 0x64, - 0xe7, 0x6d, 0x3d, 0xb7, 0x34, 0xbe, 0x2f, 0xa5, 0x26, 0xac, - 0x19, 0x93, 0x10, 0x9a, 0x0b, 0x81, 0x02, 0x88, 0x75, 0xff, - 0x7c, 0xf6, 0x67, 0xed, 0x6e, 0xe4, 0x51, 0xdb, 0x58, 0xd2, - 0x43, 0xc9, 0x4a, 0xc0, 0xad, 0x27, 0xa4, 0x2e, 0xbf, 0x35, - 0xb6, 0x3c, 0x89, 0x03, 0x80, 0x0a, 0x9b, 0x11, 0x92, 0x18, - 0xe5, 0x6f, 0xec, 0x66, 0xf7, 0x7d, 0xfe, 0x74, 0xc1, 0x4b, - 0xc8, 0x42, 0xd3, 0x59, 0xda, 0x50, 0x7a, 0xf0, 0x73, 0xf9, - 0x68, 0xe2, 0x61, 0xeb, 0x5e, 0xd4, 0x57, 0xdd, 0x4c, 0xc6, - 0x45, 0xcf, 0x32, 0xb8, 0x3b, 0xb1, 0x20, 0xaa, 0x29, 0xa3, - 0x16, 0x9c, 0x1f, 0x95, 0x04, 0x8e, 0x0d, 0x87, 0xea, 0x60, - 0xe3, 0x69, 0xf8, 0x72, 0xf1, 0x7b, 0xce, 0x44, 0xc7, 0x4d, - 0xdc, 0x56, 0xd5, 0x5f, 0xa2, 0x28, 0xab, 0x21, 0xb0, 0x3a, - 0xb9, 0x33, 0x86, 0x0c, 0x8f, 0x05, 0x94, 0x1e, 0x9d, 0x17, - 0x47, 0xcd, 0x4e, 0xc4, 0x55, 0xdf, 0x5c, 0xd6, 0x63, 0xe9, - 0x6a, 0xe0, 0x71, 0xfb, 0x78, 0xf2, 0x0f, 0x85, 0x06, 0x8c, - 0x1d, 0x97, 0x14, 0x9e, 0x2b, 0xa1, 0x22, 0xa8, 0x39, 0xb3, - 0x30, 0xba, 0xd7, 0x5d, 0xde, 0x54, 0xc5, 0x4f, 0xcc, 0x46, - 0xf3, 0x79, 0xfa, 0x70, 0xe1, 0x6b, 0xe8, 0x62, 0x9f, 0x15, - 0x96, 0x1c, 0x8d, 0x07, 0x84, 0x0e, 0xbb, 0x31, 0xb2, 0x38, - 0xa9, 0x23, 0xa0, 0x2a, 0x00, 0x8b, 0x0b, 0x80, 0x16, 0x9d, - 0x1d, 0x96, 0x2c, 0xa7, 0x27, 0xac, 0x3a, 0xb1, 0x31, 0xba, - 0x58, 0xd3, 0x53, 0xd8, 0x4e, 0xc5, 0x45, 0xce, 0x74, 0xff, - 0x7f, 0xf4, 0x62, 0xe9, 0x69, 0xe2, 0xb0, 0x3b, 0xbb, 0x30, - 0xa6, 0x2d, 0xad, 0x26, 0x9c, 0x17, 0x97, 0x1c, 0x8a, 0x01, - 0x81, 0x0a, 0xe8, 0x63, 0xe3, 0x68, 0xfe, 0x75, 0xf5, 0x7e, - 0xc4, 0x4f, 0xcf, 0x44, 0xd2, 0x59, 0xd9, 0x52, 0x7d, 0xf6, - 0x76, 0xfd, 0x6b, 0xe0, 0x60, 0xeb, 0x51, 0xda, 0x5a, 0xd1, - 0x47, 0xcc, 0x4c, 0xc7, 0x25, 0xae, 0x2e, 0xa5, 0x33, 0xb8, - 0x38, 0xb3, 0x09, 0x82, 0x02, 0x89, 0x1f, 0x94, 0x14, 0x9f, - 0xcd, 0x46, 0xc6, 0x4d, 0xdb, 0x50, 0xd0, 0x5b, 0xe1, 0x6a, - 0xea, 0x61, 0xf7, 0x7c, 0xfc, 0x77, 0x95, 0x1e, 0x9e, 0x15, - 0x83, 0x08, 0x88, 0x03, 0xb9, 0x32, 0xb2, 0x39, 0xaf, 0x24, - 0xa4, 0x2f, 0xfa, 0x71, 0xf1, 0x7a, 0xec, 0x67, 0xe7, 0x6c, - 0xd6, 0x5d, 0xdd, 0x56, 0xc0, 0x4b, 0xcb, 0x40, 0xa2, 0x29, - 0xa9, 0x22, 0xb4, 0x3f, 0xbf, 0x34, 0x8e, 0x05, 0x85, 0x0e, - 0x98, 0x13, 0x93, 0x18, 0x4a, 0xc1, 0x41, 0xca, 0x5c, 0xd7, - 0x57, 0xdc, 0x66, 0xed, 0x6d, 0xe6, 0x70, 0xfb, 0x7b, 0xf0, - 0x12, 0x99, 0x19, 0x92, 0x04, 0x8f, 0x0f, 0x84, 0x3e, 0xb5, - 0x35, 0xbe, 0x28, 0xa3, 0x23, 0xa8, 0x87, 0x0c, 0x8c, 0x07, - 0x91, 0x1a, 0x9a, 0x11, 0xab, 0x20, 0xa0, 0x2b, 0xbd, 0x36, - 0xb6, 0x3d, 0xdf, 0x54, 0xd4, 0x5f, 0xc9, 0x42, 0xc2, 0x49, - 0xf3, 0x78, 0xf8, 0x73, 0xe5, 0x6e, 0xee, 0x65, 0x37, 0xbc, - 0x3c, 0xb7, 0x21, 0xaa, 0x2a, 0xa1, 0x1b, 0x90, 0x10, 0x9b, - 0x0d, 0x86, 0x06, 0x8d, 0x6f, 0xe4, 0x64, 0xef, 0x79, 0xf2, - 0x72, 0xf9, 0x43, 0xc8, 0x48, 0xc3, 0x55, 0xde, 0x5e, 0xd5, - 0x00, 0x8c, 0x05, 0x89, 0x0a, 0x86, 0x0f, 0x83, 0x14, 0x98, - 0x11, 0x9d, 0x1e, 0x92, 0x1b, 0x97, 0x28, 0xa4, 0x2d, 0xa1, - 0x22, 0xae, 0x27, 0xab, 0x3c, 0xb0, 0x39, 0xb5, 0x36, 0xba, - 0x33, 0xbf, 0x50, 0xdc, 0x55, 0xd9, 0x5a, 0xd6, 0x5f, 0xd3, - 0x44, 0xc8, 0x41, 0xcd, 0x4e, 0xc2, 0x4b, 0xc7, 0x78, 0xf4, - 0x7d, 0xf1, 0x72, 0xfe, 0x77, 0xfb, 0x6c, 0xe0, 0x69, 0xe5, - 0x66, 0xea, 0x63, 0xef, 0xa0, 0x2c, 0xa5, 0x29, 0xaa, 0x26, - 0xaf, 0x23, 0xb4, 0x38, 0xb1, 0x3d, 0xbe, 0x32, 0xbb, 0x37, - 0x88, 0x04, 0x8d, 0x01, 0x82, 0x0e, 0x87, 0x0b, 0x9c, 0x10, - 0x99, 0x15, 0x96, 0x1a, 0x93, 0x1f, 0xf0, 0x7c, 0xf5, 0x79, - 0xfa, 0x76, 0xff, 0x73, 0xe4, 0x68, 0xe1, 0x6d, 0xee, 0x62, - 0xeb, 0x67, 0xd8, 0x54, 0xdd, 0x51, 0xd2, 0x5e, 0xd7, 0x5b, - 0xcc, 0x40, 0xc9, 0x45, 0xc6, 0x4a, 0xc3, 0x4f, 0x5d, 0xd1, - 0x58, 0xd4, 0x57, 0xdb, 0x52, 0xde, 0x49, 0xc5, 0x4c, 0xc0, - 0x43, 0xcf, 0x46, 0xca, 0x75, 0xf9, 0x70, 0xfc, 0x7f, 0xf3, - 0x7a, 0xf6, 0x61, 0xed, 0x64, 0xe8, 0x6b, 0xe7, 0x6e, 0xe2, - 0x0d, 0x81, 0x08, 0x84, 0x07, 0x8b, 0x02, 0x8e, 0x19, 0x95, - 0x1c, 0x90, 0x13, 0x9f, 0x16, 0x9a, 0x25, 0xa9, 0x20, 0xac, - 0x2f, 0xa3, 0x2a, 0xa6, 0x31, 0xbd, 0x34, 0xb8, 0x3b, 0xb7, - 0x3e, 0xb2, 0xfd, 0x71, 0xf8, 0x74, 0xf7, 0x7b, 0xf2, 0x7e, - 0xe9, 0x65, 0xec, 0x60, 0xe3, 0x6f, 0xe6, 0x6a, 0xd5, 0x59, - 0xd0, 0x5c, 0xdf, 0x53, 0xda, 0x56, 0xc1, 0x4d, 0xc4, 0x48, - 0xcb, 0x47, 0xce, 0x42, 0xad, 0x21, 0xa8, 0x24, 0xa7, 0x2b, - 0xa2, 0x2e, 0xb9, 0x35, 0xbc, 0x30, 0xb3, 0x3f, 0xb6, 0x3a, - 0x85, 0x09, 0x80, 0x0c, 0x8f, 0x03, 0x8a, 0x06, 0x91, 0x1d, - 0x94, 0x18, 0x9b, 0x17, 0x9e, 0x12, 0x00, 0x8d, 0x07, 0x8a, - 0x0e, 0x83, 0x09, 0x84, 0x1c, 0x91, 0x1b, 0x96, 0x12, 0x9f, - 0x15, 0x98, 0x38, 0xb5, 0x3f, 0xb2, 0x36, 0xbb, 0x31, 0xbc, - 0x24, 0xa9, 0x23, 0xae, 0x2a, 0xa7, 0x2d, 0xa0, 0x70, 0xfd, - 0x77, 0xfa, 0x7e, 0xf3, 0x79, 0xf4, 0x6c, 0xe1, 0x6b, 0xe6, - 0x62, 0xef, 0x65, 0xe8, 0x48, 0xc5, 0x4f, 0xc2, 0x46, 0xcb, - 0x41, 0xcc, 0x54, 0xd9, 0x53, 0xde, 0x5a, 0xd7, 0x5d, 0xd0, - 0xe0, 0x6d, 0xe7, 0x6a, 0xee, 0x63, 0xe9, 0x64, 0xfc, 0x71, - 0xfb, 0x76, 0xf2, 0x7f, 0xf5, 0x78, 0xd8, 0x55, 0xdf, 0x52, - 0xd6, 0x5b, 0xd1, 0x5c, 0xc4, 0x49, 0xc3, 0x4e, 0xca, 0x47, - 0xcd, 0x40, 0x90, 0x1d, 0x97, 0x1a, 0x9e, 0x13, 0x99, 0x14, - 0x8c, 0x01, 0x8b, 0x06, 0x82, 0x0f, 0x85, 0x08, 0xa8, 0x25, - 0xaf, 0x22, 0xa6, 0x2b, 0xa1, 0x2c, 0xb4, 0x39, 0xb3, 0x3e, - 0xba, 0x37, 0xbd, 0x30, 0xdd, 0x50, 0xda, 0x57, 0xd3, 0x5e, - 0xd4, 0x59, 0xc1, 0x4c, 0xc6, 0x4b, 0xcf, 0x42, 0xc8, 0x45, - 0xe5, 0x68, 0xe2, 0x6f, 0xeb, 0x66, 0xec, 0x61, 0xf9, 0x74, - 0xfe, 0x73, 0xf7, 0x7a, 0xf0, 0x7d, 0xad, 0x20, 0xaa, 0x27, - 0xa3, 0x2e, 0xa4, 0x29, 0xb1, 0x3c, 0xb6, 0x3b, 0xbf, 0x32, - 0xb8, 0x35, 0x95, 0x18, 0x92, 0x1f, 0x9b, 0x16, 0x9c, 0x11, - 0x89, 0x04, 0x8e, 0x03, 0x87, 0x0a, 0x80, 0x0d, 0x3d, 0xb0, - 0x3a, 0xb7, 0x33, 0xbe, 0x34, 0xb9, 0x21, 0xac, 0x26, 0xab, - 0x2f, 0xa2, 0x28, 0xa5, 0x05, 0x88, 0x02, 0x8f, 0x0b, 0x86, - 0x0c, 0x81, 0x19, 0x94, 0x1e, 0x93, 0x17, 0x9a, 0x10, 0x9d, - 0x4d, 0xc0, 0x4a, 0xc7, 0x43, 0xce, 0x44, 0xc9, 0x51, 0xdc, - 0x56, 0xdb, 0x5f, 0xd2, 0x58, 0xd5, 0x75, 0xf8, 0x72, 0xff, - 0x7b, 0xf6, 0x7c, 0xf1, 0x69, 0xe4, 0x6e, 0xe3, 0x67, 0xea, - 0x60, 0xed, 0x00, 0x8e, 0x01, 0x8f, 0x02, 0x8c, 0x03, 0x8d, - 0x04, 0x8a, 0x05, 0x8b, 0x06, 0x88, 0x07, 0x89, 0x08, 0x86, - 0x09, 0x87, 0x0a, 0x84, 0x0b, 0x85, 0x0c, 0x82, 0x0d, 0x83, - 0x0e, 0x80, 0x0f, 0x81, 0x10, 0x9e, 0x11, 0x9f, 0x12, 0x9c, - 0x13, 0x9d, 0x14, 0x9a, 0x15, 0x9b, 0x16, 0x98, 0x17, 0x99, - 0x18, 0x96, 0x19, 0x97, 0x1a, 0x94, 0x1b, 0x95, 0x1c, 0x92, - 0x1d, 0x93, 0x1e, 0x90, 0x1f, 0x91, 0x20, 0xae, 0x21, 0xaf, - 0x22, 0xac, 0x23, 0xad, 0x24, 0xaa, 0x25, 0xab, 0x26, 0xa8, - 0x27, 0xa9, 0x28, 0xa6, 0x29, 0xa7, 0x2a, 0xa4, 0x2b, 0xa5, - 0x2c, 0xa2, 0x2d, 0xa3, 0x2e, 0xa0, 0x2f, 0xa1, 0x30, 0xbe, - 0x31, 0xbf, 0x32, 0xbc, 0x33, 0xbd, 0x34, 0xba, 0x35, 0xbb, - 0x36, 0xb8, 0x37, 0xb9, 0x38, 0xb6, 0x39, 0xb7, 0x3a, 0xb4, - 0x3b, 0xb5, 0x3c, 0xb2, 0x3d, 0xb3, 0x3e, 0xb0, 0x3f, 0xb1, - 0x40, 0xce, 0x41, 0xcf, 0x42, 0xcc, 0x43, 0xcd, 0x44, 0xca, - 0x45, 0xcb, 0x46, 0xc8, 0x47, 0xc9, 0x48, 0xc6, 0x49, 0xc7, - 0x4a, 0xc4, 0x4b, 0xc5, 0x4c, 0xc2, 0x4d, 0xc3, 0x4e, 0xc0, - 0x4f, 0xc1, 0x50, 0xde, 0x51, 0xdf, 0x52, 0xdc, 0x53, 0xdd, - 0x54, 0xda, 0x55, 0xdb, 0x56, 0xd8, 0x57, 0xd9, 0x58, 0xd6, - 0x59, 0xd7, 0x5a, 0xd4, 0x5b, 0xd5, 0x5c, 0xd2, 0x5d, 0xd3, - 0x5e, 0xd0, 0x5f, 0xd1, 0x60, 0xee, 0x61, 0xef, 0x62, 0xec, - 0x63, 0xed, 0x64, 0xea, 0x65, 0xeb, 0x66, 0xe8, 0x67, 0xe9, - 0x68, 0xe6, 0x69, 0xe7, 0x6a, 0xe4, 0x6b, 0xe5, 0x6c, 0xe2, - 0x6d, 0xe3, 0x6e, 0xe0, 0x6f, 0xe1, 0x70, 0xfe, 0x71, 0xff, - 0x72, 0xfc, 0x73, 0xfd, 0x74, 0xfa, 0x75, 0xfb, 0x76, 0xf8, - 0x77, 0xf9, 0x78, 0xf6, 0x79, 0xf7, 0x7a, 0xf4, 0x7b, 0xf5, - 0x7c, 0xf2, 0x7d, 0xf3, 0x7e, 0xf0, 0x7f, 0xf1, 0x00, 0x8f, - 0x03, 0x8c, 0x06, 0x89, 0x05, 0x8a, 0x0c, 0x83, 0x0f, 0x80, - 0x0a, 0x85, 0x09, 0x86, 0x18, 0x97, 0x1b, 0x94, 0x1e, 0x91, - 0x1d, 0x92, 0x14, 0x9b, 0x17, 0x98, 0x12, 0x9d, 0x11, 0x9e, - 0x30, 0xbf, 0x33, 0xbc, 0x36, 0xb9, 0x35, 0xba, 0x3c, 0xb3, - 0x3f, 0xb0, 0x3a, 0xb5, 0x39, 0xb6, 0x28, 0xa7, 0x2b, 0xa4, - 0x2e, 0xa1, 0x2d, 0xa2, 0x24, 0xab, 0x27, 0xa8, 0x22, 0xad, - 0x21, 0xae, 0x60, 0xef, 0x63, 0xec, 0x66, 0xe9, 0x65, 0xea, - 0x6c, 0xe3, 0x6f, 0xe0, 0x6a, 0xe5, 0x69, 0xe6, 0x78, 0xf7, - 0x7b, 0xf4, 0x7e, 0xf1, 0x7d, 0xf2, 0x74, 0xfb, 0x77, 0xf8, - 0x72, 0xfd, 0x71, 0xfe, 0x50, 0xdf, 0x53, 0xdc, 0x56, 0xd9, - 0x55, 0xda, 0x5c, 0xd3, 0x5f, 0xd0, 0x5a, 0xd5, 0x59, 0xd6, - 0x48, 0xc7, 0x4b, 0xc4, 0x4e, 0xc1, 0x4d, 0xc2, 0x44, 0xcb, - 0x47, 0xc8, 0x42, 0xcd, 0x41, 0xce, 0xc0, 0x4f, 0xc3, 0x4c, - 0xc6, 0x49, 0xc5, 0x4a, 0xcc, 0x43, 0xcf, 0x40, 0xca, 0x45, - 0xc9, 0x46, 0xd8, 0x57, 0xdb, 0x54, 0xde, 0x51, 0xdd, 0x52, - 0xd4, 0x5b, 0xd7, 0x58, 0xd2, 0x5d, 0xd1, 0x5e, 0xf0, 0x7f, - 0xf3, 0x7c, 0xf6, 0x79, 0xf5, 0x7a, 0xfc, 0x73, 0xff, 0x70, - 0xfa, 0x75, 0xf9, 0x76, 0xe8, 0x67, 0xeb, 0x64, 0xee, 0x61, - 0xed, 0x62, 0xe4, 0x6b, 0xe7, 0x68, 0xe2, 0x6d, 0xe1, 0x6e, - 0xa0, 0x2f, 0xa3, 0x2c, 0xa6, 0x29, 0xa5, 0x2a, 0xac, 0x23, - 0xaf, 0x20, 0xaa, 0x25, 0xa9, 0x26, 0xb8, 0x37, 0xbb, 0x34, - 0xbe, 0x31, 0xbd, 0x32, 0xb4, 0x3b, 0xb7, 0x38, 0xb2, 0x3d, - 0xb1, 0x3e, 0x90, 0x1f, 0x93, 0x1c, 0x96, 0x19, 0x95, 0x1a, - 0x9c, 0x13, 0x9f, 0x10, 0x9a, 0x15, 0x99, 0x16, 0x88, 0x07, - 0x8b, 0x04, 0x8e, 0x01, 0x8d, 0x02, 0x84, 0x0b, 0x87, 0x08, - 0x82, 0x0d, 0x81, 0x0e, 0x00, 0x90, 0x3d, 0xad, 0x7a, 0xea, - 0x47, 0xd7, 0xf4, 0x64, 0xc9, 0x59, 0x8e, 0x1e, 0xb3, 0x23, - 0xf5, 0x65, 0xc8, 0x58, 0x8f, 0x1f, 0xb2, 0x22, 0x01, 0x91, - 0x3c, 0xac, 0x7b, 0xeb, 0x46, 0xd6, 0xf7, 0x67, 0xca, 0x5a, - 0x8d, 0x1d, 0xb0, 0x20, 0x03, 0x93, 0x3e, 0xae, 0x79, 0xe9, - 0x44, 0xd4, 0x02, 0x92, 0x3f, 0xaf, 0x78, 0xe8, 0x45, 0xd5, - 0xf6, 0x66, 0xcb, 0x5b, 0x8c, 0x1c, 0xb1, 0x21, 0xf3, 0x63, - 0xce, 0x5e, 0x89, 0x19, 0xb4, 0x24, 0x07, 0x97, 0x3a, 0xaa, - 0x7d, 0xed, 0x40, 0xd0, 0x06, 0x96, 0x3b, 0xab, 0x7c, 0xec, - 0x41, 0xd1, 0xf2, 0x62, 0xcf, 0x5f, 0x88, 0x18, 0xb5, 0x25, - 0x04, 0x94, 0x39, 0xa9, 0x7e, 0xee, 0x43, 0xd3, 0xf0, 0x60, - 0xcd, 0x5d, 0x8a, 0x1a, 0xb7, 0x27, 0xf1, 0x61, 0xcc, 0x5c, - 0x8b, 0x1b, 0xb6, 0x26, 0x05, 0x95, 0x38, 0xa8, 0x7f, 0xef, - 0x42, 0xd2, 0xfb, 0x6b, 0xc6, 0x56, 0x81, 0x11, 0xbc, 0x2c, - 0x0f, 0x9f, 0x32, 0xa2, 0x75, 0xe5, 0x48, 0xd8, 0x0e, 0x9e, - 0x33, 0xa3, 0x74, 0xe4, 0x49, 0xd9, 0xfa, 0x6a, 0xc7, 0x57, - 0x80, 0x10, 0xbd, 0x2d, 0x0c, 0x9c, 0x31, 0xa1, 0x76, 0xe6, - 0x4b, 0xdb, 0xf8, 0x68, 0xc5, 0x55, 0x82, 0x12, 0xbf, 0x2f, - 0xf9, 0x69, 0xc4, 0x54, 0x83, 0x13, 0xbe, 0x2e, 0x0d, 0x9d, - 0x30, 0xa0, 0x77, 0xe7, 0x4a, 0xda, 0x08, 0x98, 0x35, 0xa5, - 0x72, 0xe2, 0x4f, 0xdf, 0xfc, 0x6c, 0xc1, 0x51, 0x86, 0x16, - 0xbb, 0x2b, 0xfd, 0x6d, 0xc0, 0x50, 0x87, 0x17, 0xba, 0x2a, - 0x09, 0x99, 0x34, 0xa4, 0x73, 0xe3, 0x4e, 0xde, 0xff, 0x6f, - 0xc2, 0x52, 0x85, 0x15, 0xb8, 0x28, 0x0b, 0x9b, 0x36, 0xa6, - 0x71, 0xe1, 0x4c, 0xdc, 0x0a, 0x9a, 0x37, 0xa7, 0x70, 0xe0, - 0x4d, 0xdd, 0xfe, 0x6e, 0xc3, 0x53, 0x84, 0x14, 0xb9, 0x29, - 0x00, 0x91, 0x3f, 0xae, 0x7e, 0xef, 0x41, 0xd0, 0xfc, 0x6d, - 0xc3, 0x52, 0x82, 0x13, 0xbd, 0x2c, 0xe5, 0x74, 0xda, 0x4b, - 0x9b, 0x0a, 0xa4, 0x35, 0x19, 0x88, 0x26, 0xb7, 0x67, 0xf6, - 0x58, 0xc9, 0xd7, 0x46, 0xe8, 0x79, 0xa9, 0x38, 0x96, 0x07, - 0x2b, 0xba, 0x14, 0x85, 0x55, 0xc4, 0x6a, 0xfb, 0x32, 0xa3, - 0x0d, 0x9c, 0x4c, 0xdd, 0x73, 0xe2, 0xce, 0x5f, 0xf1, 0x60, - 0xb0, 0x21, 0x8f, 0x1e, 0xb3, 0x22, 0x8c, 0x1d, 0xcd, 0x5c, - 0xf2, 0x63, 0x4f, 0xde, 0x70, 0xe1, 0x31, 0xa0, 0x0e, 0x9f, - 0x56, 0xc7, 0x69, 0xf8, 0x28, 0xb9, 0x17, 0x86, 0xaa, 0x3b, - 0x95, 0x04, 0xd4, 0x45, 0xeb, 0x7a, 0x64, 0xf5, 0x5b, 0xca, - 0x1a, 0x8b, 0x25, 0xb4, 0x98, 0x09, 0xa7, 0x36, 0xe6, 0x77, - 0xd9, 0x48, 0x81, 0x10, 0xbe, 0x2f, 0xff, 0x6e, 0xc0, 0x51, - 0x7d, 0xec, 0x42, 0xd3, 0x03, 0x92, 0x3c, 0xad, 0x7b, 0xea, - 0x44, 0xd5, 0x05, 0x94, 0x3a, 0xab, 0x87, 0x16, 0xb8, 0x29, - 0xf9, 0x68, 0xc6, 0x57, 0x9e, 0x0f, 0xa1, 0x30, 0xe0, 0x71, - 0xdf, 0x4e, 0x62, 0xf3, 0x5d, 0xcc, 0x1c, 0x8d, 0x23, 0xb2, - 0xac, 0x3d, 0x93, 0x02, 0xd2, 0x43, 0xed, 0x7c, 0x50, 0xc1, - 0x6f, 0xfe, 0x2e, 0xbf, 0x11, 0x80, 0x49, 0xd8, 0x76, 0xe7, - 0x37, 0xa6, 0x08, 0x99, 0xb5, 0x24, 0x8a, 0x1b, 0xcb, 0x5a, - 0xf4, 0x65, 0xc8, 0x59, 0xf7, 0x66, 0xb6, 0x27, 0x89, 0x18, - 0x34, 0xa5, 0x0b, 0x9a, 0x4a, 0xdb, 0x75, 0xe4, 0x2d, 0xbc, - 0x12, 0x83, 0x53, 0xc2, 0x6c, 0xfd, 0xd1, 0x40, 0xee, 0x7f, - 0xaf, 0x3e, 0x90, 0x01, 0x1f, 0x8e, 0x20, 0xb1, 0x61, 0xf0, - 0x5e, 0xcf, 0xe3, 0x72, 0xdc, 0x4d, 0x9d, 0x0c, 0xa2, 0x33, - 0xfa, 0x6b, 0xc5, 0x54, 0x84, 0x15, 0xbb, 0x2a, 0x06, 0x97, - 0x39, 0xa8, 0x78, 0xe9, 0x47, 0xd6, 0x00, 0x92, 0x39, 0xab, - 0x72, 0xe0, 0x4b, 0xd9, 0xe4, 0x76, 0xdd, 0x4f, 0x96, 0x04, - 0xaf, 0x3d, 0xd5, 0x47, 0xec, 0x7e, 0xa7, 0x35, 0x9e, 0x0c, - 0x31, 0xa3, 0x08, 0x9a, 0x43, 0xd1, 0x7a, 0xe8, 0xb7, 0x25, - 0x8e, 0x1c, 0xc5, 0x57, 0xfc, 0x6e, 0x53, 0xc1, 0x6a, 0xf8, - 0x21, 0xb3, 0x18, 0x8a, 0x62, 0xf0, 0x5b, 0xc9, 0x10, 0x82, - 0x29, 0xbb, 0x86, 0x14, 0xbf, 0x2d, 0xf4, 0x66, 0xcd, 0x5f, - 0x73, 0xe1, 0x4a, 0xd8, 0x01, 0x93, 0x38, 0xaa, 0x97, 0x05, - 0xae, 0x3c, 0xe5, 0x77, 0xdc, 0x4e, 0xa6, 0x34, 0x9f, 0x0d, - 0xd4, 0x46, 0xed, 0x7f, 0x42, 0xd0, 0x7b, 0xe9, 0x30, 0xa2, - 0x09, 0x9b, 0xc4, 0x56, 0xfd, 0x6f, 0xb6, 0x24, 0x8f, 0x1d, - 0x20, 0xb2, 0x19, 0x8b, 0x52, 0xc0, 0x6b, 0xf9, 0x11, 0x83, - 0x28, 0xba, 0x63, 0xf1, 0x5a, 0xc8, 0xf5, 0x67, 0xcc, 0x5e, - 0x87, 0x15, 0xbe, 0x2c, 0xe6, 0x74, 0xdf, 0x4d, 0x94, 0x06, - 0xad, 0x3f, 0x02, 0x90, 0x3b, 0xa9, 0x70, 0xe2, 0x49, 0xdb, - 0x33, 0xa1, 0x0a, 0x98, 0x41, 0xd3, 0x78, 0xea, 0xd7, 0x45, - 0xee, 0x7c, 0xa5, 0x37, 0x9c, 0x0e, 0x51, 0xc3, 0x68, 0xfa, - 0x23, 0xb1, 0x1a, 0x88, 0xb5, 0x27, 0x8c, 0x1e, 0xc7, 0x55, - 0xfe, 0x6c, 0x84, 0x16, 0xbd, 0x2f, 0xf6, 0x64, 0xcf, 0x5d, - 0x60, 0xf2, 0x59, 0xcb, 0x12, 0x80, 0x2b, 0xb9, 0x95, 0x07, - 0xac, 0x3e, 0xe7, 0x75, 0xde, 0x4c, 0x71, 0xe3, 0x48, 0xda, - 0x03, 0x91, 0x3a, 0xa8, 0x40, 0xd2, 0x79, 0xeb, 0x32, 0xa0, - 0x0b, 0x99, 0xa4, 0x36, 0x9d, 0x0f, 0xd6, 0x44, 0xef, 0x7d, - 0x22, 0xb0, 0x1b, 0x89, 0x50, 0xc2, 0x69, 0xfb, 0xc6, 0x54, - 0xff, 0x6d, 0xb4, 0x26, 0x8d, 0x1f, 0xf7, 0x65, 0xce, 0x5c, - 0x85, 0x17, 0xbc, 0x2e, 0x13, 0x81, 0x2a, 0xb8, 0x61, 0xf3, - 0x58, 0xca, 0x00, 0x93, 0x3b, 0xa8, 0x76, 0xe5, 0x4d, 0xde, - 0xec, 0x7f, 0xd7, 0x44, 0x9a, 0x09, 0xa1, 0x32, 0xc5, 0x56, - 0xfe, 0x6d, 0xb3, 0x20, 0x88, 0x1b, 0x29, 0xba, 0x12, 0x81, - 0x5f, 0xcc, 0x64, 0xf7, 0x97, 0x04, 0xac, 0x3f, 0xe1, 0x72, - 0xda, 0x49, 0x7b, 0xe8, 0x40, 0xd3, 0x0d, 0x9e, 0x36, 0xa5, - 0x52, 0xc1, 0x69, 0xfa, 0x24, 0xb7, 0x1f, 0x8c, 0xbe, 0x2d, - 0x85, 0x16, 0xc8, 0x5b, 0xf3, 0x60, 0x33, 0xa0, 0x08, 0x9b, - 0x45, 0xd6, 0x7e, 0xed, 0xdf, 0x4c, 0xe4, 0x77, 0xa9, 0x3a, - 0x92, 0x01, 0xf6, 0x65, 0xcd, 0x5e, 0x80, 0x13, 0xbb, 0x28, - 0x1a, 0x89, 0x21, 0xb2, 0x6c, 0xff, 0x57, 0xc4, 0xa4, 0x37, - 0x9f, 0x0c, 0xd2, 0x41, 0xe9, 0x7a, 0x48, 0xdb, 0x73, 0xe0, - 0x3e, 0xad, 0x05, 0x96, 0x61, 0xf2, 0x5a, 0xc9, 0x17, 0x84, - 0x2c, 0xbf, 0x8d, 0x1e, 0xb6, 0x25, 0xfb, 0x68, 0xc0, 0x53, - 0x66, 0xf5, 0x5d, 0xce, 0x10, 0x83, 0x2b, 0xb8, 0x8a, 0x19, - 0xb1, 0x22, 0xfc, 0x6f, 0xc7, 0x54, 0xa3, 0x30, 0x98, 0x0b, - 0xd5, 0x46, 0xee, 0x7d, 0x4f, 0xdc, 0x74, 0xe7, 0x39, 0xaa, - 0x02, 0x91, 0xf1, 0x62, 0xca, 0x59, 0x87, 0x14, 0xbc, 0x2f, - 0x1d, 0x8e, 0x26, 0xb5, 0x6b, 0xf8, 0x50, 0xc3, 0x34, 0xa7, - 0x0f, 0x9c, 0x42, 0xd1, 0x79, 0xea, 0xd8, 0x4b, 0xe3, 0x70, - 0xae, 0x3d, 0x95, 0x06, 0x55, 0xc6, 0x6e, 0xfd, 0x23, 0xb0, - 0x18, 0x8b, 0xb9, 0x2a, 0x82, 0x11, 0xcf, 0x5c, 0xf4, 0x67, - 0x90, 0x03, 0xab, 0x38, 0xe6, 0x75, 0xdd, 0x4e, 0x7c, 0xef, - 0x47, 0xd4, 0x0a, 0x99, 0x31, 0xa2, 0xc2, 0x51, 0xf9, 0x6a, - 0xb4, 0x27, 0x8f, 0x1c, 0x2e, 0xbd, 0x15, 0x86, 0x58, 0xcb, - 0x63, 0xf0, 0x07, 0x94, 0x3c, 0xaf, 0x71, 0xe2, 0x4a, 0xd9, - 0xeb, 0x78, 0xd0, 0x43, 0x9d, 0x0e, 0xa6, 0x35, 0x00, 0x94, - 0x35, 0xa1, 0x6a, 0xfe, 0x5f, 0xcb, 0xd4, 0x40, 0xe1, 0x75, - 0xbe, 0x2a, 0x8b, 0x1f, 0xb5, 0x21, 0x80, 0x14, 0xdf, 0x4b, - 0xea, 0x7e, 0x61, 0xf5, 0x54, 0xc0, 0x0b, 0x9f, 0x3e, 0xaa, - 0x77, 0xe3, 0x42, 0xd6, 0x1d, 0x89, 0x28, 0xbc, 0xa3, 0x37, - 0x96, 0x02, 0xc9, 0x5d, 0xfc, 0x68, 0xc2, 0x56, 0xf7, 0x63, - 0xa8, 0x3c, 0x9d, 0x09, 0x16, 0x82, 0x23, 0xb7, 0x7c, 0xe8, - 0x49, 0xdd, 0xee, 0x7a, 0xdb, 0x4f, 0x84, 0x10, 0xb1, 0x25, - 0x3a, 0xae, 0x0f, 0x9b, 0x50, 0xc4, 0x65, 0xf1, 0x5b, 0xcf, - 0x6e, 0xfa, 0x31, 0xa5, 0x04, 0x90, 0x8f, 0x1b, 0xba, 0x2e, - 0xe5, 0x71, 0xd0, 0x44, 0x99, 0x0d, 0xac, 0x38, 0xf3, 0x67, - 0xc6, 0x52, 0x4d, 0xd9, 0x78, 0xec, 0x27, 0xb3, 0x12, 0x86, - 0x2c, 0xb8, 0x19, 0x8d, 0x46, 0xd2, 0x73, 0xe7, 0xf8, 0x6c, - 0xcd, 0x59, 0x92, 0x06, 0xa7, 0x33, 0xc1, 0x55, 0xf4, 0x60, - 0xab, 0x3f, 0x9e, 0x0a, 0x15, 0x81, 0x20, 0xb4, 0x7f, 0xeb, - 0x4a, 0xde, 0x74, 0xe0, 0x41, 0xd5, 0x1e, 0x8a, 0x2b, 0xbf, - 0xa0, 0x34, 0x95, 0x01, 0xca, 0x5e, 0xff, 0x6b, 0xb6, 0x22, - 0x83, 0x17, 0xdc, 0x48, 0xe9, 0x7d, 0x62, 0xf6, 0x57, 0xc3, - 0x08, 0x9c, 0x3d, 0xa9, 0x03, 0x97, 0x36, 0xa2, 0x69, 0xfd, - 0x5c, 0xc8, 0xd7, 0x43, 0xe2, 0x76, 0xbd, 0x29, 0x88, 0x1c, - 0x2f, 0xbb, 0x1a, 0x8e, 0x45, 0xd1, 0x70, 0xe4, 0xfb, 0x6f, - 0xce, 0x5a, 0x91, 0x05, 0xa4, 0x30, 0x9a, 0x0e, 0xaf, 0x3b, - 0xf0, 0x64, 0xc5, 0x51, 0x4e, 0xda, 0x7b, 0xef, 0x24, 0xb0, - 0x11, 0x85, 0x58, 0xcc, 0x6d, 0xf9, 0x32, 0xa6, 0x07, 0x93, - 0x8c, 0x18, 0xb9, 0x2d, 0xe6, 0x72, 0xd3, 0x47, 0xed, 0x79, - 0xd8, 0x4c, 0x87, 0x13, 0xb2, 0x26, 0x39, 0xad, 0x0c, 0x98, - 0x53, 0xc7, 0x66, 0xf2, 0x00, 0x95, 0x37, 0xa2, 0x6e, 0xfb, - 0x59, 0xcc, 0xdc, 0x49, 0xeb, 0x7e, 0xb2, 0x27, 0x85, 0x10, - 0xa5, 0x30, 0x92, 0x07, 0xcb, 0x5e, 0xfc, 0x69, 0x79, 0xec, - 0x4e, 0xdb, 0x17, 0x82, 0x20, 0xb5, 0x57, 0xc2, 0x60, 0xf5, - 0x39, 0xac, 0x0e, 0x9b, 0x8b, 0x1e, 0xbc, 0x29, 0xe5, 0x70, - 0xd2, 0x47, 0xf2, 0x67, 0xc5, 0x50, 0x9c, 0x09, 0xab, 0x3e, - 0x2e, 0xbb, 0x19, 0x8c, 0x40, 0xd5, 0x77, 0xe2, 0xae, 0x3b, - 0x99, 0x0c, 0xc0, 0x55, 0xf7, 0x62, 0x72, 0xe7, 0x45, 0xd0, - 0x1c, 0x89, 0x2b, 0xbe, 0x0b, 0x9e, 0x3c, 0xa9, 0x65, 0xf0, - 0x52, 0xc7, 0xd7, 0x42, 0xe0, 0x75, 0xb9, 0x2c, 0x8e, 0x1b, - 0xf9, 0x6c, 0xce, 0x5b, 0x97, 0x02, 0xa0, 0x35, 0x25, 0xb0, - 0x12, 0x87, 0x4b, 0xde, 0x7c, 0xe9, 0x5c, 0xc9, 0x6b, 0xfe, - 0x32, 0xa7, 0x05, 0x90, 0x80, 0x15, 0xb7, 0x22, 0xee, 0x7b, - 0xd9, 0x4c, 0x41, 0xd4, 0x76, 0xe3, 0x2f, 0xba, 0x18, 0x8d, - 0x9d, 0x08, 0xaa, 0x3f, 0xf3, 0x66, 0xc4, 0x51, 0xe4, 0x71, - 0xd3, 0x46, 0x8a, 0x1f, 0xbd, 0x28, 0x38, 0xad, 0x0f, 0x9a, - 0x56, 0xc3, 0x61, 0xf4, 0x16, 0x83, 0x21, 0xb4, 0x78, 0xed, - 0x4f, 0xda, 0xca, 0x5f, 0xfd, 0x68, 0xa4, 0x31, 0x93, 0x06, - 0xb3, 0x26, 0x84, 0x11, 0xdd, 0x48, 0xea, 0x7f, 0x6f, 0xfa, - 0x58, 0xcd, 0x01, 0x94, 0x36, 0xa3, 0xef, 0x7a, 0xd8, 0x4d, - 0x81, 0x14, 0xb6, 0x23, 0x33, 0xa6, 0x04, 0x91, 0x5d, 0xc8, - 0x6a, 0xff, 0x4a, 0xdf, 0x7d, 0xe8, 0x24, 0xb1, 0x13, 0x86, - 0x96, 0x03, 0xa1, 0x34, 0xf8, 0x6d, 0xcf, 0x5a, 0xb8, 0x2d, - 0x8f, 0x1a, 0xd6, 0x43, 0xe1, 0x74, 0x64, 0xf1, 0x53, 0xc6, - 0x0a, 0x9f, 0x3d, 0xa8, 0x1d, 0x88, 0x2a, 0xbf, 0x73, 0xe6, - 0x44, 0xd1, 0xc1, 0x54, 0xf6, 0x63, 0xaf, 0x3a, 0x98, 0x0d, - 0x00, 0x96, 0x31, 0xa7, 0x62, 0xf4, 0x53, 0xc5, 0xc4, 0x52, - 0xf5, 0x63, 0xa6, 0x30, 0x97, 0x01, 0x95, 0x03, 0xa4, 0x32, - 0xf7, 0x61, 0xc6, 0x50, 0x51, 0xc7, 0x60, 0xf6, 0x33, 0xa5, - 0x02, 0x94, 0x37, 0xa1, 0x06, 0x90, 0x55, 0xc3, 0x64, 0xf2, - 0xf3, 0x65, 0xc2, 0x54, 0x91, 0x07, 0xa0, 0x36, 0xa2, 0x34, - 0x93, 0x05, 0xc0, 0x56, 0xf1, 0x67, 0x66, 0xf0, 0x57, 0xc1, - 0x04, 0x92, 0x35, 0xa3, 0x6e, 0xf8, 0x5f, 0xc9, 0x0c, 0x9a, - 0x3d, 0xab, 0xaa, 0x3c, 0x9b, 0x0d, 0xc8, 0x5e, 0xf9, 0x6f, - 0xfb, 0x6d, 0xca, 0x5c, 0x99, 0x0f, 0xa8, 0x3e, 0x3f, 0xa9, - 0x0e, 0x98, 0x5d, 0xcb, 0x6c, 0xfa, 0x59, 0xcf, 0x68, 0xfe, - 0x3b, 0xad, 0x0a, 0x9c, 0x9d, 0x0b, 0xac, 0x3a, 0xff, 0x69, - 0xce, 0x58, 0xcc, 0x5a, 0xfd, 0x6b, 0xae, 0x38, 0x9f, 0x09, - 0x08, 0x9e, 0x39, 0xaf, 0x6a, 0xfc, 0x5b, 0xcd, 0xdc, 0x4a, - 0xed, 0x7b, 0xbe, 0x28, 0x8f, 0x19, 0x18, 0x8e, 0x29, 0xbf, - 0x7a, 0xec, 0x4b, 0xdd, 0x49, 0xdf, 0x78, 0xee, 0x2b, 0xbd, - 0x1a, 0x8c, 0x8d, 0x1b, 0xbc, 0x2a, 0xef, 0x79, 0xde, 0x48, - 0xeb, 0x7d, 0xda, 0x4c, 0x89, 0x1f, 0xb8, 0x2e, 0x2f, 0xb9, - 0x1e, 0x88, 0x4d, 0xdb, 0x7c, 0xea, 0x7e, 0xe8, 0x4f, 0xd9, - 0x1c, 0x8a, 0x2d, 0xbb, 0xba, 0x2c, 0x8b, 0x1d, 0xd8, 0x4e, - 0xe9, 0x7f, 0xb2, 0x24, 0x83, 0x15, 0xd0, 0x46, 0xe1, 0x77, - 0x76, 0xe0, 0x47, 0xd1, 0x14, 0x82, 0x25, 0xb3, 0x27, 0xb1, - 0x16, 0x80, 0x45, 0xd3, 0x74, 0xe2, 0xe3, 0x75, 0xd2, 0x44, - 0x81, 0x17, 0xb0, 0x26, 0x85, 0x13, 0xb4, 0x22, 0xe7, 0x71, - 0xd6, 0x40, 0x41, 0xd7, 0x70, 0xe6, 0x23, 0xb5, 0x12, 0x84, - 0x10, 0x86, 0x21, 0xb7, 0x72, 0xe4, 0x43, 0xd5, 0xd4, 0x42, - 0xe5, 0x73, 0xb6, 0x20, 0x87, 0x11, 0x00, 0x97, 0x33, 0xa4, - 0x66, 0xf1, 0x55, 0xc2, 0xcc, 0x5b, 0xff, 0x68, 0xaa, 0x3d, - 0x99, 0x0e, 0x85, 0x12, 0xb6, 0x21, 0xe3, 0x74, 0xd0, 0x47, - 0x49, 0xde, 0x7a, 0xed, 0x2f, 0xb8, 0x1c, 0x8b, 0x17, 0x80, - 0x24, 0xb3, 0x71, 0xe6, 0x42, 0xd5, 0xdb, 0x4c, 0xe8, 0x7f, - 0xbd, 0x2a, 0x8e, 0x19, 0x92, 0x05, 0xa1, 0x36, 0xf4, 0x63, - 0xc7, 0x50, 0x5e, 0xc9, 0x6d, 0xfa, 0x38, 0xaf, 0x0b, 0x9c, - 0x2e, 0xb9, 0x1d, 0x8a, 0x48, 0xdf, 0x7b, 0xec, 0xe2, 0x75, - 0xd1, 0x46, 0x84, 0x13, 0xb7, 0x20, 0xab, 0x3c, 0x98, 0x0f, - 0xcd, 0x5a, 0xfe, 0x69, 0x67, 0xf0, 0x54, 0xc3, 0x01, 0x96, - 0x32, 0xa5, 0x39, 0xae, 0x0a, 0x9d, 0x5f, 0xc8, 0x6c, 0xfb, - 0xf5, 0x62, 0xc6, 0x51, 0x93, 0x04, 0xa0, 0x37, 0xbc, 0x2b, - 0x8f, 0x18, 0xda, 0x4d, 0xe9, 0x7e, 0x70, 0xe7, 0x43, 0xd4, - 0x16, 0x81, 0x25, 0xb2, 0x5c, 0xcb, 0x6f, 0xf8, 0x3a, 0xad, - 0x09, 0x9e, 0x90, 0x07, 0xa3, 0x34, 0xf6, 0x61, 0xc5, 0x52, - 0xd9, 0x4e, 0xea, 0x7d, 0xbf, 0x28, 0x8c, 0x1b, 0x15, 0x82, - 0x26, 0xb1, 0x73, 0xe4, 0x40, 0xd7, 0x4b, 0xdc, 0x78, 0xef, - 0x2d, 0xba, 0x1e, 0x89, 0x87, 0x10, 0xb4, 0x23, 0xe1, 0x76, - 0xd2, 0x45, 0xce, 0x59, 0xfd, 0x6a, 0xa8, 0x3f, 0x9b, 0x0c, - 0x02, 0x95, 0x31, 0xa6, 0x64, 0xf3, 0x57, 0xc0, 0x72, 0xe5, - 0x41, 0xd6, 0x14, 0x83, 0x27, 0xb0, 0xbe, 0x29, 0x8d, 0x1a, - 0xd8, 0x4f, 0xeb, 0x7c, 0xf7, 0x60, 0xc4, 0x53, 0x91, 0x06, - 0xa2, 0x35, 0x3b, 0xac, 0x08, 0x9f, 0x5d, 0xca, 0x6e, 0xf9, - 0x65, 0xf2, 0x56, 0xc1, 0x03, 0x94, 0x30, 0xa7, 0xa9, 0x3e, - 0x9a, 0x0d, 0xcf, 0x58, 0xfc, 0x6b, 0xe0, 0x77, 0xd3, 0x44, - 0x86, 0x11, 0xb5, 0x22, 0x2c, 0xbb, 0x1f, 0x88, 0x4a, 0xdd, - 0x79, 0xee, 0x00, 0x98, 0x2d, 0xb5, 0x5a, 0xc2, 0x77, 0xef, - 0xb4, 0x2c, 0x99, 0x01, 0xee, 0x76, 0xc3, 0x5b, 0x75, 0xed, - 0x58, 0xc0, 0x2f, 0xb7, 0x02, 0x9a, 0xc1, 0x59, 0xec, 0x74, - 0x9b, 0x03, 0xb6, 0x2e, 0xea, 0x72, 0xc7, 0x5f, 0xb0, 0x28, - 0x9d, 0x05, 0x5e, 0xc6, 0x73, 0xeb, 0x04, 0x9c, 0x29, 0xb1, - 0x9f, 0x07, 0xb2, 0x2a, 0xc5, 0x5d, 0xe8, 0x70, 0x2b, 0xb3, - 0x06, 0x9e, 0x71, 0xe9, 0x5c, 0xc4, 0xc9, 0x51, 0xe4, 0x7c, - 0x93, 0x0b, 0xbe, 0x26, 0x7d, 0xe5, 0x50, 0xc8, 0x27, 0xbf, - 0x0a, 0x92, 0xbc, 0x24, 0x91, 0x09, 0xe6, 0x7e, 0xcb, 0x53, - 0x08, 0x90, 0x25, 0xbd, 0x52, 0xca, 0x7f, 0xe7, 0x23, 0xbb, - 0x0e, 0x96, 0x79, 0xe1, 0x54, 0xcc, 0x97, 0x0f, 0xba, 0x22, - 0xcd, 0x55, 0xe0, 0x78, 0x56, 0xce, 0x7b, 0xe3, 0x0c, 0x94, - 0x21, 0xb9, 0xe2, 0x7a, 0xcf, 0x57, 0xb8, 0x20, 0x95, 0x0d, - 0x8f, 0x17, 0xa2, 0x3a, 0xd5, 0x4d, 0xf8, 0x60, 0x3b, 0xa3, - 0x16, 0x8e, 0x61, 0xf9, 0x4c, 0xd4, 0xfa, 0x62, 0xd7, 0x4f, - 0xa0, 0x38, 0x8d, 0x15, 0x4e, 0xd6, 0x63, 0xfb, 0x14, 0x8c, - 0x39, 0xa1, 0x65, 0xfd, 0x48, 0xd0, 0x3f, 0xa7, 0x12, 0x8a, - 0xd1, 0x49, 0xfc, 0x64, 0x8b, 0x13, 0xa6, 0x3e, 0x10, 0x88, - 0x3d, 0xa5, 0x4a, 0xd2, 0x67, 0xff, 0xa4, 0x3c, 0x89, 0x11, - 0xfe, 0x66, 0xd3, 0x4b, 0x46, 0xde, 0x6b, 0xf3, 0x1c, 0x84, - 0x31, 0xa9, 0xf2, 0x6a, 0xdf, 0x47, 0xa8, 0x30, 0x85, 0x1d, - 0x33, 0xab, 0x1e, 0x86, 0x69, 0xf1, 0x44, 0xdc, 0x87, 0x1f, - 0xaa, 0x32, 0xdd, 0x45, 0xf0, 0x68, 0xac, 0x34, 0x81, 0x19, - 0xf6, 0x6e, 0xdb, 0x43, 0x18, 0x80, 0x35, 0xad, 0x42, 0xda, - 0x6f, 0xf7, 0xd9, 0x41, 0xf4, 0x6c, 0x83, 0x1b, 0xae, 0x36, - 0x6d, 0xf5, 0x40, 0xd8, 0x37, 0xaf, 0x1a, 0x82, 0x00, 0x99, - 0x2f, 0xb6, 0x5e, 0xc7, 0x71, 0xe8, 0xbc, 0x25, 0x93, 0x0a, - 0xe2, 0x7b, 0xcd, 0x54, 0x65, 0xfc, 0x4a, 0xd3, 0x3b, 0xa2, - 0x14, 0x8d, 0xd9, 0x40, 0xf6, 0x6f, 0x87, 0x1e, 0xa8, 0x31, - 0xca, 0x53, 0xe5, 0x7c, 0x94, 0x0d, 0xbb, 0x22, 0x76, 0xef, - 0x59, 0xc0, 0x28, 0xb1, 0x07, 0x9e, 0xaf, 0x36, 0x80, 0x19, - 0xf1, 0x68, 0xde, 0x47, 0x13, 0x8a, 0x3c, 0xa5, 0x4d, 0xd4, - 0x62, 0xfb, 0x89, 0x10, 0xa6, 0x3f, 0xd7, 0x4e, 0xf8, 0x61, - 0x35, 0xac, 0x1a, 0x83, 0x6b, 0xf2, 0x44, 0xdd, 0xec, 0x75, - 0xc3, 0x5a, 0xb2, 0x2b, 0x9d, 0x04, 0x50, 0xc9, 0x7f, 0xe6, - 0x0e, 0x97, 0x21, 0xb8, 0x43, 0xda, 0x6c, 0xf5, 0x1d, 0x84, - 0x32, 0xab, 0xff, 0x66, 0xd0, 0x49, 0xa1, 0x38, 0x8e, 0x17, - 0x26, 0xbf, 0x09, 0x90, 0x78, 0xe1, 0x57, 0xce, 0x9a, 0x03, - 0xb5, 0x2c, 0xc4, 0x5d, 0xeb, 0x72, 0x0f, 0x96, 0x20, 0xb9, - 0x51, 0xc8, 0x7e, 0xe7, 0xb3, 0x2a, 0x9c, 0x05, 0xed, 0x74, - 0xc2, 0x5b, 0x6a, 0xf3, 0x45, 0xdc, 0x34, 0xad, 0x1b, 0x82, - 0xd6, 0x4f, 0xf9, 0x60, 0x88, 0x11, 0xa7, 0x3e, 0xc5, 0x5c, - 0xea, 0x73, 0x9b, 0x02, 0xb4, 0x2d, 0x79, 0xe0, 0x56, 0xcf, - 0x27, 0xbe, 0x08, 0x91, 0xa0, 0x39, 0x8f, 0x16, 0xfe, 0x67, - 0xd1, 0x48, 0x1c, 0x85, 0x33, 0xaa, 0x42, 0xdb, 0x6d, 0xf4, - 0x86, 0x1f, 0xa9, 0x30, 0xd8, 0x41, 0xf7, 0x6e, 0x3a, 0xa3, - 0x15, 0x8c, 0x64, 0xfd, 0x4b, 0xd2, 0xe3, 0x7a, 0xcc, 0x55, - 0xbd, 0x24, 0x92, 0x0b, 0x5f, 0xc6, 0x70, 0xe9, 0x01, 0x98, - 0x2e, 0xb7, 0x4c, 0xd5, 0x63, 0xfa, 0x12, 0x8b, 0x3d, 0xa4, - 0xf0, 0x69, 0xdf, 0x46, 0xae, 0x37, 0x81, 0x18, 0x29, 0xb0, - 0x06, 0x9f, 0x77, 0xee, 0x58, 0xc1, 0x95, 0x0c, 0xba, 0x23, - 0xcb, 0x52, 0xe4, 0x7d, 0x00, 0x9a, 0x29, 0xb3, 0x52, 0xc8, - 0x7b, 0xe1, 0xa4, 0x3e, 0x8d, 0x17, 0xf6, 0x6c, 0xdf, 0x45, - 0x55, 0xcf, 0x7c, 0xe6, 0x07, 0x9d, 0x2e, 0xb4, 0xf1, 0x6b, - 0xd8, 0x42, 0xa3, 0x39, 0x8a, 0x10, 0xaa, 0x30, 0x83, 0x19, - 0xf8, 0x62, 0xd1, 0x4b, 0x0e, 0x94, 0x27, 0xbd, 0x5c, 0xc6, - 0x75, 0xef, 0xff, 0x65, 0xd6, 0x4c, 0xad, 0x37, 0x84, 0x1e, - 0x5b, 0xc1, 0x72, 0xe8, 0x09, 0x93, 0x20, 0xba, 0x49, 0xd3, - 0x60, 0xfa, 0x1b, 0x81, 0x32, 0xa8, 0xed, 0x77, 0xc4, 0x5e, - 0xbf, 0x25, 0x96, 0x0c, 0x1c, 0x86, 0x35, 0xaf, 0x4e, 0xd4, - 0x67, 0xfd, 0xb8, 0x22, 0x91, 0x0b, 0xea, 0x70, 0xc3, 0x59, - 0xe3, 0x79, 0xca, 0x50, 0xb1, 0x2b, 0x98, 0x02, 0x47, 0xdd, - 0x6e, 0xf4, 0x15, 0x8f, 0x3c, 0xa6, 0xb6, 0x2c, 0x9f, 0x05, - 0xe4, 0x7e, 0xcd, 0x57, 0x12, 0x88, 0x3b, 0xa1, 0x40, 0xda, - 0x69, 0xf3, 0x92, 0x08, 0xbb, 0x21, 0xc0, 0x5a, 0xe9, 0x73, - 0x36, 0xac, 0x1f, 0x85, 0x64, 0xfe, 0x4d, 0xd7, 0xc7, 0x5d, - 0xee, 0x74, 0x95, 0x0f, 0xbc, 0x26, 0x63, 0xf9, 0x4a, 0xd0, - 0x31, 0xab, 0x18, 0x82, 0x38, 0xa2, 0x11, 0x8b, 0x6a, 0xf0, - 0x43, 0xd9, 0x9c, 0x06, 0xb5, 0x2f, 0xce, 0x54, 0xe7, 0x7d, - 0x6d, 0xf7, 0x44, 0xde, 0x3f, 0xa5, 0x16, 0x8c, 0xc9, 0x53, - 0xe0, 0x7a, 0x9b, 0x01, 0xb2, 0x28, 0xdb, 0x41, 0xf2, 0x68, - 0x89, 0x13, 0xa0, 0x3a, 0x7f, 0xe5, 0x56, 0xcc, 0x2d, 0xb7, - 0x04, 0x9e, 0x8e, 0x14, 0xa7, 0x3d, 0xdc, 0x46, 0xf5, 0x6f, - 0x2a, 0xb0, 0x03, 0x99, 0x78, 0xe2, 0x51, 0xcb, 0x71, 0xeb, - 0x58, 0xc2, 0x23, 0xb9, 0x0a, 0x90, 0xd5, 0x4f, 0xfc, 0x66, - 0x87, 0x1d, 0xae, 0x34, 0x24, 0xbe, 0x0d, 0x97, 0x76, 0xec, - 0x5f, 0xc5, 0x80, 0x1a, 0xa9, 0x33, 0xd2, 0x48, 0xfb, 0x61, - 0x00, 0x9b, 0x2b, 0xb0, 0x56, 0xcd, 0x7d, 0xe6, 0xac, 0x37, - 0x87, 0x1c, 0xfa, 0x61, 0xd1, 0x4a, 0x45, 0xde, 0x6e, 0xf5, - 0x13, 0x88, 0x38, 0xa3, 0xe9, 0x72, 0xc2, 0x59, 0xbf, 0x24, - 0x94, 0x0f, 0x8a, 0x11, 0xa1, 0x3a, 0xdc, 0x47, 0xf7, 0x6c, - 0x26, 0xbd, 0x0d, 0x96, 0x70, 0xeb, 0x5b, 0xc0, 0xcf, 0x54, - 0xe4, 0x7f, 0x99, 0x02, 0xb2, 0x29, 0x63, 0xf8, 0x48, 0xd3, - 0x35, 0xae, 0x1e, 0x85, 0x09, 0x92, 0x22, 0xb9, 0x5f, 0xc4, - 0x74, 0xef, 0xa5, 0x3e, 0x8e, 0x15, 0xf3, 0x68, 0xd8, 0x43, - 0x4c, 0xd7, 0x67, 0xfc, 0x1a, 0x81, 0x31, 0xaa, 0xe0, 0x7b, - 0xcb, 0x50, 0xb6, 0x2d, 0x9d, 0x06, 0x83, 0x18, 0xa8, 0x33, - 0xd5, 0x4e, 0xfe, 0x65, 0x2f, 0xb4, 0x04, 0x9f, 0x79, 0xe2, - 0x52, 0xc9, 0xc6, 0x5d, 0xed, 0x76, 0x90, 0x0b, 0xbb, 0x20, - 0x6a, 0xf1, 0x41, 0xda, 0x3c, 0xa7, 0x17, 0x8c, 0x12, 0x89, - 0x39, 0xa2, 0x44, 0xdf, 0x6f, 0xf4, 0xbe, 0x25, 0x95, 0x0e, - 0xe8, 0x73, 0xc3, 0x58, 0x57, 0xcc, 0x7c, 0xe7, 0x01, 0x9a, - 0x2a, 0xb1, 0xfb, 0x60, 0xd0, 0x4b, 0xad, 0x36, 0x86, 0x1d, - 0x98, 0x03, 0xb3, 0x28, 0xce, 0x55, 0xe5, 0x7e, 0x34, 0xaf, - 0x1f, 0x84, 0x62, 0xf9, 0x49, 0xd2, 0xdd, 0x46, 0xf6, 0x6d, - 0x8b, 0x10, 0xa0, 0x3b, 0x71, 0xea, 0x5a, 0xc1, 0x27, 0xbc, - 0x0c, 0x97, 0x1b, 0x80, 0x30, 0xab, 0x4d, 0xd6, 0x66, 0xfd, - 0xb7, 0x2c, 0x9c, 0x07, 0xe1, 0x7a, 0xca, 0x51, 0x5e, 0xc5, - 0x75, 0xee, 0x08, 0x93, 0x23, 0xb8, 0xf2, 0x69, 0xd9, 0x42, - 0xa4, 0x3f, 0x8f, 0x14, 0x91, 0x0a, 0xba, 0x21, 0xc7, 0x5c, - 0xec, 0x77, 0x3d, 0xa6, 0x16, 0x8d, 0x6b, 0xf0, 0x40, 0xdb, - 0xd4, 0x4f, 0xff, 0x64, 0x82, 0x19, 0xa9, 0x32, 0x78, 0xe3, - 0x53, 0xc8, 0x2e, 0xb5, 0x05, 0x9e, 0x00, 0x9c, 0x25, 0xb9, - 0x4a, 0xd6, 0x6f, 0xf3, 0x94, 0x08, 0xb1, 0x2d, 0xde, 0x42, - 0xfb, 0x67, 0x35, 0xa9, 0x10, 0x8c, 0x7f, 0xe3, 0x5a, 0xc6, - 0xa1, 0x3d, 0x84, 0x18, 0xeb, 0x77, 0xce, 0x52, 0x6a, 0xf6, - 0x4f, 0xd3, 0x20, 0xbc, 0x05, 0x99, 0xfe, 0x62, 0xdb, 0x47, - 0xb4, 0x28, 0x91, 0x0d, 0x5f, 0xc3, 0x7a, 0xe6, 0x15, 0x89, - 0x30, 0xac, 0xcb, 0x57, 0xee, 0x72, 0x81, 0x1d, 0xa4, 0x38, - 0xd4, 0x48, 0xf1, 0x6d, 0x9e, 0x02, 0xbb, 0x27, 0x40, 0xdc, - 0x65, 0xf9, 0x0a, 0x96, 0x2f, 0xb3, 0xe1, 0x7d, 0xc4, 0x58, - 0xab, 0x37, 0x8e, 0x12, 0x75, 0xe9, 0x50, 0xcc, 0x3f, 0xa3, - 0x1a, 0x86, 0xbe, 0x22, 0x9b, 0x07, 0xf4, 0x68, 0xd1, 0x4d, - 0x2a, 0xb6, 0x0f, 0x93, 0x60, 0xfc, 0x45, 0xd9, 0x8b, 0x17, - 0xae, 0x32, 0xc1, 0x5d, 0xe4, 0x78, 0x1f, 0x83, 0x3a, 0xa6, - 0x55, 0xc9, 0x70, 0xec, 0xb5, 0x29, 0x90, 0x0c, 0xff, 0x63, - 0xda, 0x46, 0x21, 0xbd, 0x04, 0x98, 0x6b, 0xf7, 0x4e, 0xd2, - 0x80, 0x1c, 0xa5, 0x39, 0xca, 0x56, 0xef, 0x73, 0x14, 0x88, - 0x31, 0xad, 0x5e, 0xc2, 0x7b, 0xe7, 0xdf, 0x43, 0xfa, 0x66, - 0x95, 0x09, 0xb0, 0x2c, 0x4b, 0xd7, 0x6e, 0xf2, 0x01, 0x9d, - 0x24, 0xb8, 0xea, 0x76, 0xcf, 0x53, 0xa0, 0x3c, 0x85, 0x19, - 0x7e, 0xe2, 0x5b, 0xc7, 0x34, 0xa8, 0x11, 0x8d, 0x61, 0xfd, - 0x44, 0xd8, 0x2b, 0xb7, 0x0e, 0x92, 0xf5, 0x69, 0xd0, 0x4c, - 0xbf, 0x23, 0x9a, 0x06, 0x54, 0xc8, 0x71, 0xed, 0x1e, 0x82, - 0x3b, 0xa7, 0xc0, 0x5c, 0xe5, 0x79, 0x8a, 0x16, 0xaf, 0x33, - 0x0b, 0x97, 0x2e, 0xb2, 0x41, 0xdd, 0x64, 0xf8, 0x9f, 0x03, - 0xba, 0x26, 0xd5, 0x49, 0xf0, 0x6c, 0x3e, 0xa2, 0x1b, 0x87, - 0x74, 0xe8, 0x51, 0xcd, 0xaa, 0x36, 0x8f, 0x13, 0xe0, 0x7c, - 0xc5, 0x59, 0x00, 0x9d, 0x27, 0xba, 0x4e, 0xd3, 0x69, 0xf4, - 0x9c, 0x01, 0xbb, 0x26, 0xd2, 0x4f, 0xf5, 0x68, 0x25, 0xb8, - 0x02, 0x9f, 0x6b, 0xf6, 0x4c, 0xd1, 0xb9, 0x24, 0x9e, 0x03, - 0xf7, 0x6a, 0xd0, 0x4d, 0x4a, 0xd7, 0x6d, 0xf0, 0x04, 0x99, - 0x23, 0xbe, 0xd6, 0x4b, 0xf1, 0x6c, 0x98, 0x05, 0xbf, 0x22, - 0x6f, 0xf2, 0x48, 0xd5, 0x21, 0xbc, 0x06, 0x9b, 0xf3, 0x6e, - 0xd4, 0x49, 0xbd, 0x20, 0x9a, 0x07, 0x94, 0x09, 0xb3, 0x2e, - 0xda, 0x47, 0xfd, 0x60, 0x08, 0x95, 0x2f, 0xb2, 0x46, 0xdb, - 0x61, 0xfc, 0xb1, 0x2c, 0x96, 0x0b, 0xff, 0x62, 0xd8, 0x45, - 0x2d, 0xb0, 0x0a, 0x97, 0x63, 0xfe, 0x44, 0xd9, 0xde, 0x43, - 0xf9, 0x64, 0x90, 0x0d, 0xb7, 0x2a, 0x42, 0xdf, 0x65, 0xf8, - 0x0c, 0x91, 0x2b, 0xb6, 0xfb, 0x66, 0xdc, 0x41, 0xb5, 0x28, - 0x92, 0x0f, 0x67, 0xfa, 0x40, 0xdd, 0x29, 0xb4, 0x0e, 0x93, - 0x35, 0xa8, 0x12, 0x8f, 0x7b, 0xe6, 0x5c, 0xc1, 0xa9, 0x34, - 0x8e, 0x13, 0xe7, 0x7a, 0xc0, 0x5d, 0x10, 0x8d, 0x37, 0xaa, - 0x5e, 0xc3, 0x79, 0xe4, 0x8c, 0x11, 0xab, 0x36, 0xc2, 0x5f, - 0xe5, 0x78, 0x7f, 0xe2, 0x58, 0xc5, 0x31, 0xac, 0x16, 0x8b, - 0xe3, 0x7e, 0xc4, 0x59, 0xad, 0x30, 0x8a, 0x17, 0x5a, 0xc7, - 0x7d, 0xe0, 0x14, 0x89, 0x33, 0xae, 0xc6, 0x5b, 0xe1, 0x7c, - 0x88, 0x15, 0xaf, 0x32, 0xa1, 0x3c, 0x86, 0x1b, 0xef, 0x72, - 0xc8, 0x55, 0x3d, 0xa0, 0x1a, 0x87, 0x73, 0xee, 0x54, 0xc9, - 0x84, 0x19, 0xa3, 0x3e, 0xca, 0x57, 0xed, 0x70, 0x18, 0x85, - 0x3f, 0xa2, 0x56, 0xcb, 0x71, 0xec, 0xeb, 0x76, 0xcc, 0x51, - 0xa5, 0x38, 0x82, 0x1f, 0x77, 0xea, 0x50, 0xcd, 0x39, 0xa4, - 0x1e, 0x83, 0xce, 0x53, 0xe9, 0x74, 0x80, 0x1d, 0xa7, 0x3a, - 0x52, 0xcf, 0x75, 0xe8, 0x1c, 0x81, 0x3b, 0xa6, 0x00, 0x9e, - 0x21, 0xbf, 0x42, 0xdc, 0x63, 0xfd, 0x84, 0x1a, 0xa5, 0x3b, - 0xc6, 0x58, 0xe7, 0x79, 0x15, 0x8b, 0x34, 0xaa, 0x57, 0xc9, - 0x76, 0xe8, 0x91, 0x0f, 0xb0, 0x2e, 0xd3, 0x4d, 0xf2, 0x6c, - 0x2a, 0xb4, 0x0b, 0x95, 0x68, 0xf6, 0x49, 0xd7, 0xae, 0x30, - 0x8f, 0x11, 0xec, 0x72, 0xcd, 0x53, 0x3f, 0xa1, 0x1e, 0x80, - 0x7d, 0xe3, 0x5c, 0xc2, 0xbb, 0x25, 0x9a, 0x04, 0xf9, 0x67, - 0xd8, 0x46, 0x54, 0xca, 0x75, 0xeb, 0x16, 0x88, 0x37, 0xa9, - 0xd0, 0x4e, 0xf1, 0x6f, 0x92, 0x0c, 0xb3, 0x2d, 0x41, 0xdf, - 0x60, 0xfe, 0x03, 0x9d, 0x22, 0xbc, 0xc5, 0x5b, 0xe4, 0x7a, - 0x87, 0x19, 0xa6, 0x38, 0x7e, 0xe0, 0x5f, 0xc1, 0x3c, 0xa2, - 0x1d, 0x83, 0xfa, 0x64, 0xdb, 0x45, 0xb8, 0x26, 0x99, 0x07, - 0x6b, 0xf5, 0x4a, 0xd4, 0x29, 0xb7, 0x08, 0x96, 0xef, 0x71, - 0xce, 0x50, 0xad, 0x33, 0x8c, 0x12, 0xa8, 0x36, 0x89, 0x17, - 0xea, 0x74, 0xcb, 0x55, 0x2c, 0xb2, 0x0d, 0x93, 0x6e, 0xf0, - 0x4f, 0xd1, 0xbd, 0x23, 0x9c, 0x02, 0xff, 0x61, 0xde, 0x40, - 0x39, 0xa7, 0x18, 0x86, 0x7b, 0xe5, 0x5a, 0xc4, 0x82, 0x1c, - 0xa3, 0x3d, 0xc0, 0x5e, 0xe1, 0x7f, 0x06, 0x98, 0x27, 0xb9, - 0x44, 0xda, 0x65, 0xfb, 0x97, 0x09, 0xb6, 0x28, 0xd5, 0x4b, - 0xf4, 0x6a, 0x13, 0x8d, 0x32, 0xac, 0x51, 0xcf, 0x70, 0xee, - 0xfc, 0x62, 0xdd, 0x43, 0xbe, 0x20, 0x9f, 0x01, 0x78, 0xe6, - 0x59, 0xc7, 0x3a, 0xa4, 0x1b, 0x85, 0xe9, 0x77, 0xc8, 0x56, - 0xab, 0x35, 0x8a, 0x14, 0x6d, 0xf3, 0x4c, 0xd2, 0x2f, 0xb1, - 0x0e, 0x90, 0xd6, 0x48, 0xf7, 0x69, 0x94, 0x0a, 0xb5, 0x2b, - 0x52, 0xcc, 0x73, 0xed, 0x10, 0x8e, 0x31, 0xaf, 0xc3, 0x5d, - 0xe2, 0x7c, 0x81, 0x1f, 0xa0, 0x3e, 0x47, 0xd9, 0x66, 0xf8, - 0x05, 0x9b, 0x24, 0xba, 0x00, 0x9f, 0x23, 0xbc, 0x46, 0xd9, - 0x65, 0xfa, 0x8c, 0x13, 0xaf, 0x30, 0xca, 0x55, 0xe9, 0x76, - 0x05, 0x9a, 0x26, 0xb9, 0x43, 0xdc, 0x60, 0xff, 0x89, 0x16, - 0xaa, 0x35, 0xcf, 0x50, 0xec, 0x73, 0x0a, 0x95, 0x29, 0xb6, - 0x4c, 0xd3, 0x6f, 0xf0, 0x86, 0x19, 0xa5, 0x3a, 0xc0, 0x5f, - 0xe3, 0x7c, 0x0f, 0x90, 0x2c, 0xb3, 0x49, 0xd6, 0x6a, 0xf5, - 0x83, 0x1c, 0xa0, 0x3f, 0xc5, 0x5a, 0xe6, 0x79, 0x14, 0x8b, - 0x37, 0xa8, 0x52, 0xcd, 0x71, 0xee, 0x98, 0x07, 0xbb, 0x24, - 0xde, 0x41, 0xfd, 0x62, 0x11, 0x8e, 0x32, 0xad, 0x57, 0xc8, - 0x74, 0xeb, 0x9d, 0x02, 0xbe, 0x21, 0xdb, 0x44, 0xf8, 0x67, - 0x1e, 0x81, 0x3d, 0xa2, 0x58, 0xc7, 0x7b, 0xe4, 0x92, 0x0d, - 0xb1, 0x2e, 0xd4, 0x4b, 0xf7, 0x68, 0x1b, 0x84, 0x38, 0xa7, - 0x5d, 0xc2, 0x7e, 0xe1, 0x97, 0x08, 0xb4, 0x2b, 0xd1, 0x4e, - 0xf2, 0x6d, 0x28, 0xb7, 0x0b, 0x94, 0x6e, 0xf1, 0x4d, 0xd2, - 0xa4, 0x3b, 0x87, 0x18, 0xe2, 0x7d, 0xc1, 0x5e, 0x2d, 0xb2, - 0x0e, 0x91, 0x6b, 0xf4, 0x48, 0xd7, 0xa1, 0x3e, 0x82, 0x1d, - 0xe7, 0x78, 0xc4, 0x5b, 0x22, 0xbd, 0x01, 0x9e, 0x64, 0xfb, - 0x47, 0xd8, 0xae, 0x31, 0x8d, 0x12, 0xe8, 0x77, 0xcb, 0x54, - 0x27, 0xb8, 0x04, 0x9b, 0x61, 0xfe, 0x42, 0xdd, 0xab, 0x34, - 0x88, 0x17, 0xed, 0x72, 0xce, 0x51, 0x3c, 0xa3, 0x1f, 0x80, - 0x7a, 0xe5, 0x59, 0xc6, 0xb0, 0x2f, 0x93, 0x0c, 0xf6, 0x69, - 0xd5, 0x4a, 0x39, 0xa6, 0x1a, 0x85, 0x7f, 0xe0, 0x5c, 0xc3, - 0xb5, 0x2a, 0x96, 0x09, 0xf3, 0x6c, 0xd0, 0x4f, 0x36, 0xa9, - 0x15, 0x8a, 0x70, 0xef, 0x53, 0xcc, 0xba, 0x25, 0x99, 0x06, - 0xfc, 0x63, 0xdf, 0x40, 0x33, 0xac, 0x10, 0x8f, 0x75, 0xea, - 0x56, 0xc9, 0xbf, 0x20, 0x9c, 0x03, 0xf9, 0x66, 0xda, 0x45, - 0x00, 0xa0, 0x5d, 0xfd, 0xba, 0x1a, 0xe7, 0x47, 0x69, 0xc9, - 0x34, 0x94, 0xd3, 0x73, 0x8e, 0x2e, 0xd2, 0x72, 0x8f, 0x2f, - 0x68, 0xc8, 0x35, 0x95, 0xbb, 0x1b, 0xe6, 0x46, 0x01, 0xa1, - 0x5c, 0xfc, 0xb9, 0x19, 0xe4, 0x44, 0x03, 0xa3, 0x5e, 0xfe, - 0xd0, 0x70, 0x8d, 0x2d, 0x6a, 0xca, 0x37, 0x97, 0x6b, 0xcb, - 0x36, 0x96, 0xd1, 0x71, 0x8c, 0x2c, 0x02, 0xa2, 0x5f, 0xff, - 0xb8, 0x18, 0xe5, 0x45, 0x6f, 0xcf, 0x32, 0x92, 0xd5, 0x75, - 0x88, 0x28, 0x06, 0xa6, 0x5b, 0xfb, 0xbc, 0x1c, 0xe1, 0x41, - 0xbd, 0x1d, 0xe0, 0x40, 0x07, 0xa7, 0x5a, 0xfa, 0xd4, 0x74, - 0x89, 0x29, 0x6e, 0xce, 0x33, 0x93, 0xd6, 0x76, 0x8b, 0x2b, - 0x6c, 0xcc, 0x31, 0x91, 0xbf, 0x1f, 0xe2, 0x42, 0x05, 0xa5, - 0x58, 0xf8, 0x04, 0xa4, 0x59, 0xf9, 0xbe, 0x1e, 0xe3, 0x43, - 0x6d, 0xcd, 0x30, 0x90, 0xd7, 0x77, 0x8a, 0x2a, 0xde, 0x7e, - 0x83, 0x23, 0x64, 0xc4, 0x39, 0x99, 0xb7, 0x17, 0xea, 0x4a, - 0x0d, 0xad, 0x50, 0xf0, 0x0c, 0xac, 0x51, 0xf1, 0xb6, 0x16, - 0xeb, 0x4b, 0x65, 0xc5, 0x38, 0x98, 0xdf, 0x7f, 0x82, 0x22, - 0x67, 0xc7, 0x3a, 0x9a, 0xdd, 0x7d, 0x80, 0x20, 0x0e, 0xae, - 0x53, 0xf3, 0xb4, 0x14, 0xe9, 0x49, 0xb5, 0x15, 0xe8, 0x48, - 0x0f, 0xaf, 0x52, 0xf2, 0xdc, 0x7c, 0x81, 0x21, 0x66, 0xc6, - 0x3b, 0x9b, 0xb1, 0x11, 0xec, 0x4c, 0x0b, 0xab, 0x56, 0xf6, - 0xd8, 0x78, 0x85, 0x25, 0x62, 0xc2, 0x3f, 0x9f, 0x63, 0xc3, - 0x3e, 0x9e, 0xd9, 0x79, 0x84, 0x24, 0x0a, 0xaa, 0x57, 0xf7, - 0xb0, 0x10, 0xed, 0x4d, 0x08, 0xa8, 0x55, 0xf5, 0xb2, 0x12, - 0xef, 0x4f, 0x61, 0xc1, 0x3c, 0x9c, 0xdb, 0x7b, 0x86, 0x26, - 0xda, 0x7a, 0x87, 0x27, 0x60, 0xc0, 0x3d, 0x9d, 0xb3, 0x13, - 0xee, 0x4e, 0x09, 0xa9, 0x54, 0xf4, 0x00, 0xa1, 0x5f, 0xfe, - 0xbe, 0x1f, 0xe1, 0x40, 0x61, 0xc0, 0x3e, 0x9f, 0xdf, 0x7e, - 0x80, 0x21, 0xc2, 0x63, 0x9d, 0x3c, 0x7c, 0xdd, 0x23, 0x82, - 0xa3, 0x02, 0xfc, 0x5d, 0x1d, 0xbc, 0x42, 0xe3, 0x99, 0x38, - 0xc6, 0x67, 0x27, 0x86, 0x78, 0xd9, 0xf8, 0x59, 0xa7, 0x06, - 0x46, 0xe7, 0x19, 0xb8, 0x5b, 0xfa, 0x04, 0xa5, 0xe5, 0x44, - 0xba, 0x1b, 0x3a, 0x9b, 0x65, 0xc4, 0x84, 0x25, 0xdb, 0x7a, - 0x2f, 0x8e, 0x70, 0xd1, 0x91, 0x30, 0xce, 0x6f, 0x4e, 0xef, - 0x11, 0xb0, 0xf0, 0x51, 0xaf, 0x0e, 0xed, 0x4c, 0xb2, 0x13, - 0x53, 0xf2, 0x0c, 0xad, 0x8c, 0x2d, 0xd3, 0x72, 0x32, 0x93, - 0x6d, 0xcc, 0xb6, 0x17, 0xe9, 0x48, 0x08, 0xa9, 0x57, 0xf6, - 0xd7, 0x76, 0x88, 0x29, 0x69, 0xc8, 0x36, 0x97, 0x74, 0xd5, - 0x2b, 0x8a, 0xca, 0x6b, 0x95, 0x34, 0x15, 0xb4, 0x4a, 0xeb, - 0xab, 0x0a, 0xf4, 0x55, 0x5e, 0xff, 0x01, 0xa0, 0xe0, 0x41, - 0xbf, 0x1e, 0x3f, 0x9e, 0x60, 0xc1, 0x81, 0x20, 0xde, 0x7f, - 0x9c, 0x3d, 0xc3, 0x62, 0x22, 0x83, 0x7d, 0xdc, 0xfd, 0x5c, - 0xa2, 0x03, 0x43, 0xe2, 0x1c, 0xbd, 0xc7, 0x66, 0x98, 0x39, - 0x79, 0xd8, 0x26, 0x87, 0xa6, 0x07, 0xf9, 0x58, 0x18, 0xb9, - 0x47, 0xe6, 0x05, 0xa4, 0x5a, 0xfb, 0xbb, 0x1a, 0xe4, 0x45, - 0x64, 0xc5, 0x3b, 0x9a, 0xda, 0x7b, 0x85, 0x24, 0x71, 0xd0, - 0x2e, 0x8f, 0xcf, 0x6e, 0x90, 0x31, 0x10, 0xb1, 0x4f, 0xee, - 0xae, 0x0f, 0xf1, 0x50, 0xb3, 0x12, 0xec, 0x4d, 0x0d, 0xac, - 0x52, 0xf3, 0xd2, 0x73, 0x8d, 0x2c, 0x6c, 0xcd, 0x33, 0x92, - 0xe8, 0x49, 0xb7, 0x16, 0x56, 0xf7, 0x09, 0xa8, 0x89, 0x28, - 0xd6, 0x77, 0x37, 0x96, 0x68, 0xc9, 0x2a, 0x8b, 0x75, 0xd4, - 0x94, 0x35, 0xcb, 0x6a, 0x4b, 0xea, 0x14, 0xb5, 0xf5, 0x54, - 0xaa, 0x0b, 0x00, 0xa2, 0x59, 0xfb, 0xb2, 0x10, 0xeb, 0x49, - 0x79, 0xdb, 0x20, 0x82, 0xcb, 0x69, 0x92, 0x30, 0xf2, 0x50, - 0xab, 0x09, 0x40, 0xe2, 0x19, 0xbb, 0x8b, 0x29, 0xd2, 0x70, - 0x39, 0x9b, 0x60, 0xc2, 0xf9, 0x5b, 0xa0, 0x02, 0x4b, 0xe9, - 0x12, 0xb0, 0x80, 0x22, 0xd9, 0x7b, 0x32, 0x90, 0x6b, 0xc9, - 0x0b, 0xa9, 0x52, 0xf0, 0xb9, 0x1b, 0xe0, 0x42, 0x72, 0xd0, - 0x2b, 0x89, 0xc0, 0x62, 0x99, 0x3b, 0xef, 0x4d, 0xb6, 0x14, - 0x5d, 0xff, 0x04, 0xa6, 0x96, 0x34, 0xcf, 0x6d, 0x24, 0x86, - 0x7d, 0xdf, 0x1d, 0xbf, 0x44, 0xe6, 0xaf, 0x0d, 0xf6, 0x54, - 0x64, 0xc6, 0x3d, 0x9f, 0xd6, 0x74, 0x8f, 0x2d, 0x16, 0xb4, - 0x4f, 0xed, 0xa4, 0x06, 0xfd, 0x5f, 0x6f, 0xcd, 0x36, 0x94, - 0xdd, 0x7f, 0x84, 0x26, 0xe4, 0x46, 0xbd, 0x1f, 0x56, 0xf4, - 0x0f, 0xad, 0x9d, 0x3f, 0xc4, 0x66, 0x2f, 0x8d, 0x76, 0xd4, - 0xc3, 0x61, 0x9a, 0x38, 0x71, 0xd3, 0x28, 0x8a, 0xba, 0x18, - 0xe3, 0x41, 0x08, 0xaa, 0x51, 0xf3, 0x31, 0x93, 0x68, 0xca, - 0x83, 0x21, 0xda, 0x78, 0x48, 0xea, 0x11, 0xb3, 0xfa, 0x58, - 0xa3, 0x01, 0x3a, 0x98, 0x63, 0xc1, 0x88, 0x2a, 0xd1, 0x73, - 0x43, 0xe1, 0x1a, 0xb8, 0xf1, 0x53, 0xa8, 0x0a, 0xc8, 0x6a, - 0x91, 0x33, 0x7a, 0xd8, 0x23, 0x81, 0xb1, 0x13, 0xe8, 0x4a, - 0x03, 0xa1, 0x5a, 0xf8, 0x2c, 0x8e, 0x75, 0xd7, 0x9e, 0x3c, - 0xc7, 0x65, 0x55, 0xf7, 0x0c, 0xae, 0xe7, 0x45, 0xbe, 0x1c, - 0xde, 0x7c, 0x87, 0x25, 0x6c, 0xce, 0x35, 0x97, 0xa7, 0x05, - 0xfe, 0x5c, 0x15, 0xb7, 0x4c, 0xee, 0xd5, 0x77, 0x8c, 0x2e, - 0x67, 0xc5, 0x3e, 0x9c, 0xac, 0x0e, 0xf5, 0x57, 0x1e, 0xbc, - 0x47, 0xe5, 0x27, 0x85, 0x7e, 0xdc, 0x95, 0x37, 0xcc, 0x6e, - 0x5e, 0xfc, 0x07, 0xa5, 0xec, 0x4e, 0xb5, 0x17, 0x00, 0xa3, - 0x5b, 0xf8, 0xb6, 0x15, 0xed, 0x4e, 0x71, 0xd2, 0x2a, 0x89, - 0xc7, 0x64, 0x9c, 0x3f, 0xe2, 0x41, 0xb9, 0x1a, 0x54, 0xf7, - 0x0f, 0xac, 0x93, 0x30, 0xc8, 0x6b, 0x25, 0x86, 0x7e, 0xdd, - 0xd9, 0x7a, 0x82, 0x21, 0x6f, 0xcc, 0x34, 0x97, 0xa8, 0x0b, - 0xf3, 0x50, 0x1e, 0xbd, 0x45, 0xe6, 0x3b, 0x98, 0x60, 0xc3, - 0x8d, 0x2e, 0xd6, 0x75, 0x4a, 0xe9, 0x11, 0xb2, 0xfc, 0x5f, - 0xa7, 0x04, 0xaf, 0x0c, 0xf4, 0x57, 0x19, 0xba, 0x42, 0xe1, - 0xde, 0x7d, 0x85, 0x26, 0x68, 0xcb, 0x33, 0x90, 0x4d, 0xee, - 0x16, 0xb5, 0xfb, 0x58, 0xa0, 0x03, 0x3c, 0x9f, 0x67, 0xc4, - 0x8a, 0x29, 0xd1, 0x72, 0x76, 0xd5, 0x2d, 0x8e, 0xc0, 0x63, - 0x9b, 0x38, 0x07, 0xa4, 0x5c, 0xff, 0xb1, 0x12, 0xea, 0x49, - 0x94, 0x37, 0xcf, 0x6c, 0x22, 0x81, 0x79, 0xda, 0xe5, 0x46, - 0xbe, 0x1d, 0x53, 0xf0, 0x08, 0xab, 0x43, 0xe0, 0x18, 0xbb, - 0xf5, 0x56, 0xae, 0x0d, 0x32, 0x91, 0x69, 0xca, 0x84, 0x27, - 0xdf, 0x7c, 0xa1, 0x02, 0xfa, 0x59, 0x17, 0xb4, 0x4c, 0xef, - 0xd0, 0x73, 0x8b, 0x28, 0x66, 0xc5, 0x3d, 0x9e, 0x9a, 0x39, - 0xc1, 0x62, 0x2c, 0x8f, 0x77, 0xd4, 0xeb, 0x48, 0xb0, 0x13, - 0x5d, 0xfe, 0x06, 0xa5, 0x78, 0xdb, 0x23, 0x80, 0xce, 0x6d, - 0x95, 0x36, 0x09, 0xaa, 0x52, 0xf1, 0xbf, 0x1c, 0xe4, 0x47, - 0xec, 0x4f, 0xb7, 0x14, 0x5a, 0xf9, 0x01, 0xa2, 0x9d, 0x3e, - 0xc6, 0x65, 0x2b, 0x88, 0x70, 0xd3, 0x0e, 0xad, 0x55, 0xf6, - 0xb8, 0x1b, 0xe3, 0x40, 0x7f, 0xdc, 0x24, 0x87, 0xc9, 0x6a, - 0x92, 0x31, 0x35, 0x96, 0x6e, 0xcd, 0x83, 0x20, 0xd8, 0x7b, - 0x44, 0xe7, 0x1f, 0xbc, 0xf2, 0x51, 0xa9, 0x0a, 0xd7, 0x74, - 0x8c, 0x2f, 0x61, 0xc2, 0x3a, 0x99, 0xa6, 0x05, 0xfd, 0x5e, - 0x10, 0xb3, 0x4b, 0xe8, 0x00, 0xa4, 0x55, 0xf1, 0xaa, 0x0e, - 0xff, 0x5b, 0x49, 0xed, 0x1c, 0xb8, 0xe3, 0x47, 0xb6, 0x12, - 0x92, 0x36, 0xc7, 0x63, 0x38, 0x9c, 0x6d, 0xc9, 0xdb, 0x7f, - 0x8e, 0x2a, 0x71, 0xd5, 0x24, 0x80, 0x39, 0x9d, 0x6c, 0xc8, - 0x93, 0x37, 0xc6, 0x62, 0x70, 0xd4, 0x25, 0x81, 0xda, 0x7e, - 0x8f, 0x2b, 0xab, 0x0f, 0xfe, 0x5a, 0x01, 0xa5, 0x54, 0xf0, - 0xe2, 0x46, 0xb7, 0x13, 0x48, 0xec, 0x1d, 0xb9, 0x72, 0xd6, - 0x27, 0x83, 0xd8, 0x7c, 0x8d, 0x29, 0x3b, 0x9f, 0x6e, 0xca, - 0x91, 0x35, 0xc4, 0x60, 0xe0, 0x44, 0xb5, 0x11, 0x4a, 0xee, - 0x1f, 0xbb, 0xa9, 0x0d, 0xfc, 0x58, 0x03, 0xa7, 0x56, 0xf2, - 0x4b, 0xef, 0x1e, 0xba, 0xe1, 0x45, 0xb4, 0x10, 0x02, 0xa6, - 0x57, 0xf3, 0xa8, 0x0c, 0xfd, 0x59, 0xd9, 0x7d, 0x8c, 0x28, - 0x73, 0xd7, 0x26, 0x82, 0x90, 0x34, 0xc5, 0x61, 0x3a, 0x9e, - 0x6f, 0xcb, 0xe4, 0x40, 0xb1, 0x15, 0x4e, 0xea, 0x1b, 0xbf, - 0xad, 0x09, 0xf8, 0x5c, 0x07, 0xa3, 0x52, 0xf6, 0x76, 0xd2, - 0x23, 0x87, 0xdc, 0x78, 0x89, 0x2d, 0x3f, 0x9b, 0x6a, 0xce, - 0x95, 0x31, 0xc0, 0x64, 0xdd, 0x79, 0x88, 0x2c, 0x77, 0xd3, - 0x22, 0x86, 0x94, 0x30, 0xc1, 0x65, 0x3e, 0x9a, 0x6b, 0xcf, - 0x4f, 0xeb, 0x1a, 0xbe, 0xe5, 0x41, 0xb0, 0x14, 0x06, 0xa2, - 0x53, 0xf7, 0xac, 0x08, 0xf9, 0x5d, 0x96, 0x32, 0xc3, 0x67, - 0x3c, 0x98, 0x69, 0xcd, 0xdf, 0x7b, 0x8a, 0x2e, 0x75, 0xd1, - 0x20, 0x84, 0x04, 0xa0, 0x51, 0xf5, 0xae, 0x0a, 0xfb, 0x5f, - 0x4d, 0xe9, 0x18, 0xbc, 0xe7, 0x43, 0xb2, 0x16, 0xaf, 0x0b, - 0xfa, 0x5e, 0x05, 0xa1, 0x50, 0xf4, 0xe6, 0x42, 0xb3, 0x17, - 0x4c, 0xe8, 0x19, 0xbd, 0x3d, 0x99, 0x68, 0xcc, 0x97, 0x33, - 0xc2, 0x66, 0x74, 0xd0, 0x21, 0x85, 0xde, 0x7a, 0x8b, 0x2f, - 0x00, 0xa5, 0x57, 0xf2, 0xae, 0x0b, 0xf9, 0x5c, 0x41, 0xe4, - 0x16, 0xb3, 0xef, 0x4a, 0xb8, 0x1d, 0x82, 0x27, 0xd5, 0x70, - 0x2c, 0x89, 0x7b, 0xde, 0xc3, 0x66, 0x94, 0x31, 0x6d, 0xc8, - 0x3a, 0x9f, 0x19, 0xbc, 0x4e, 0xeb, 0xb7, 0x12, 0xe0, 0x45, - 0x58, 0xfd, 0x0f, 0xaa, 0xf6, 0x53, 0xa1, 0x04, 0x9b, 0x3e, - 0xcc, 0x69, 0x35, 0x90, 0x62, 0xc7, 0xda, 0x7f, 0x8d, 0x28, - 0x74, 0xd1, 0x23, 0x86, 0x32, 0x97, 0x65, 0xc0, 0x9c, 0x39, - 0xcb, 0x6e, 0x73, 0xd6, 0x24, 0x81, 0xdd, 0x78, 0x8a, 0x2f, - 0xb0, 0x15, 0xe7, 0x42, 0x1e, 0xbb, 0x49, 0xec, 0xf1, 0x54, - 0xa6, 0x03, 0x5f, 0xfa, 0x08, 0xad, 0x2b, 0x8e, 0x7c, 0xd9, - 0x85, 0x20, 0xd2, 0x77, 0x6a, 0xcf, 0x3d, 0x98, 0xc4, 0x61, - 0x93, 0x36, 0xa9, 0x0c, 0xfe, 0x5b, 0x07, 0xa2, 0x50, 0xf5, - 0xe8, 0x4d, 0xbf, 0x1a, 0x46, 0xe3, 0x11, 0xb4, 0x64, 0xc1, - 0x33, 0x96, 0xca, 0x6f, 0x9d, 0x38, 0x25, 0x80, 0x72, 0xd7, - 0x8b, 0x2e, 0xdc, 0x79, 0xe6, 0x43, 0xb1, 0x14, 0x48, 0xed, - 0x1f, 0xba, 0xa7, 0x02, 0xf0, 0x55, 0x09, 0xac, 0x5e, 0xfb, - 0x7d, 0xd8, 0x2a, 0x8f, 0xd3, 0x76, 0x84, 0x21, 0x3c, 0x99, - 0x6b, 0xce, 0x92, 0x37, 0xc5, 0x60, 0xff, 0x5a, 0xa8, 0x0d, - 0x51, 0xf4, 0x06, 0xa3, 0xbe, 0x1b, 0xe9, 0x4c, 0x10, 0xb5, - 0x47, 0xe2, 0x56, 0xf3, 0x01, 0xa4, 0xf8, 0x5d, 0xaf, 0x0a, - 0x17, 0xb2, 0x40, 0xe5, 0xb9, 0x1c, 0xee, 0x4b, 0xd4, 0x71, - 0x83, 0x26, 0x7a, 0xdf, 0x2d, 0x88, 0x95, 0x30, 0xc2, 0x67, - 0x3b, 0x9e, 0x6c, 0xc9, 0x4f, 0xea, 0x18, 0xbd, 0xe1, 0x44, - 0xb6, 0x13, 0x0e, 0xab, 0x59, 0xfc, 0xa0, 0x05, 0xf7, 0x52, - 0xcd, 0x68, 0x9a, 0x3f, 0x63, 0xc6, 0x34, 0x91, 0x8c, 0x29, - 0xdb, 0x7e, 0x22, 0x87, 0x75, 0xd0, 0x00, 0xa6, 0x51, 0xf7, - 0xa2, 0x04, 0xf3, 0x55, 0x59, 0xff, 0x08, 0xae, 0xfb, 0x5d, - 0xaa, 0x0c, 0xb2, 0x14, 0xe3, 0x45, 0x10, 0xb6, 0x41, 0xe7, - 0xeb, 0x4d, 0xba, 0x1c, 0x49, 0xef, 0x18, 0xbe, 0x79, 0xdf, - 0x28, 0x8e, 0xdb, 0x7d, 0x8a, 0x2c, 0x20, 0x86, 0x71, 0xd7, - 0x82, 0x24, 0xd3, 0x75, 0xcb, 0x6d, 0x9a, 0x3c, 0x69, 0xcf, - 0x38, 0x9e, 0x92, 0x34, 0xc3, 0x65, 0x30, 0x96, 0x61, 0xc7, - 0xf2, 0x54, 0xa3, 0x05, 0x50, 0xf6, 0x01, 0xa7, 0xab, 0x0d, - 0xfa, 0x5c, 0x09, 0xaf, 0x58, 0xfe, 0x40, 0xe6, 0x11, 0xb7, - 0xe2, 0x44, 0xb3, 0x15, 0x19, 0xbf, 0x48, 0xee, 0xbb, 0x1d, - 0xea, 0x4c, 0x8b, 0x2d, 0xda, 0x7c, 0x29, 0x8f, 0x78, 0xde, - 0xd2, 0x74, 0x83, 0x25, 0x70, 0xd6, 0x21, 0x87, 0x39, 0x9f, - 0x68, 0xce, 0x9b, 0x3d, 0xca, 0x6c, 0x60, 0xc6, 0x31, 0x97, - 0xc2, 0x64, 0x93, 0x35, 0xf9, 0x5f, 0xa8, 0x0e, 0x5b, 0xfd, - 0x0a, 0xac, 0xa0, 0x06, 0xf1, 0x57, 0x02, 0xa4, 0x53, 0xf5, - 0x4b, 0xed, 0x1a, 0xbc, 0xe9, 0x4f, 0xb8, 0x1e, 0x12, 0xb4, - 0x43, 0xe5, 0xb0, 0x16, 0xe1, 0x47, 0x80, 0x26, 0xd1, 0x77, - 0x22, 0x84, 0x73, 0xd5, 0xd9, 0x7f, 0x88, 0x2e, 0x7b, 0xdd, - 0x2a, 0x8c, 0x32, 0x94, 0x63, 0xc5, 0x90, 0x36, 0xc1, 0x67, - 0x6b, 0xcd, 0x3a, 0x9c, 0xc9, 0x6f, 0x98, 0x3e, 0x0b, 0xad, - 0x5a, 0xfc, 0xa9, 0x0f, 0xf8, 0x5e, 0x52, 0xf4, 0x03, 0xa5, - 0xf0, 0x56, 0xa1, 0x07, 0xb9, 0x1f, 0xe8, 0x4e, 0x1b, 0xbd, - 0x4a, 0xec, 0xe0, 0x46, 0xb1, 0x17, 0x42, 0xe4, 0x13, 0xb5, - 0x72, 0xd4, 0x23, 0x85, 0xd0, 0x76, 0x81, 0x27, 0x2b, 0x8d, - 0x7a, 0xdc, 0x89, 0x2f, 0xd8, 0x7e, 0xc0, 0x66, 0x91, 0x37, - 0x62, 0xc4, 0x33, 0x95, 0x99, 0x3f, 0xc8, 0x6e, 0x3b, 0x9d, - 0x6a, 0xcc, 0x00, 0xa7, 0x53, 0xf4, 0xa6, 0x01, 0xf5, 0x52, - 0x51, 0xf6, 0x02, 0xa5, 0xf7, 0x50, 0xa4, 0x03, 0xa2, 0x05, - 0xf1, 0x56, 0x04, 0xa3, 0x57, 0xf0, 0xf3, 0x54, 0xa0, 0x07, - 0x55, 0xf2, 0x06, 0xa1, 0x59, 0xfe, 0x0a, 0xad, 0xff, 0x58, - 0xac, 0x0b, 0x08, 0xaf, 0x5b, 0xfc, 0xae, 0x09, 0xfd, 0x5a, - 0xfb, 0x5c, 0xa8, 0x0f, 0x5d, 0xfa, 0x0e, 0xa9, 0xaa, 0x0d, - 0xf9, 0x5e, 0x0c, 0xab, 0x5f, 0xf8, 0xb2, 0x15, 0xe1, 0x46, - 0x14, 0xb3, 0x47, 0xe0, 0xe3, 0x44, 0xb0, 0x17, 0x45, 0xe2, - 0x16, 0xb1, 0x10, 0xb7, 0x43, 0xe4, 0xb6, 0x11, 0xe5, 0x42, - 0x41, 0xe6, 0x12, 0xb5, 0xe7, 0x40, 0xb4, 0x13, 0xeb, 0x4c, - 0xb8, 0x1f, 0x4d, 0xea, 0x1e, 0xb9, 0xba, 0x1d, 0xe9, 0x4e, - 0x1c, 0xbb, 0x4f, 0xe8, 0x49, 0xee, 0x1a, 0xbd, 0xef, 0x48, - 0xbc, 0x1b, 0x18, 0xbf, 0x4b, 0xec, 0xbe, 0x19, 0xed, 0x4a, - 0x79, 0xde, 0x2a, 0x8d, 0xdf, 0x78, 0x8c, 0x2b, 0x28, 0x8f, - 0x7b, 0xdc, 0x8e, 0x29, 0xdd, 0x7a, 0xdb, 0x7c, 0x88, 0x2f, - 0x7d, 0xda, 0x2e, 0x89, 0x8a, 0x2d, 0xd9, 0x7e, 0x2c, 0x8b, - 0x7f, 0xd8, 0x20, 0x87, 0x73, 0xd4, 0x86, 0x21, 0xd5, 0x72, - 0x71, 0xd6, 0x22, 0x85, 0xd7, 0x70, 0x84, 0x23, 0x82, 0x25, - 0xd1, 0x76, 0x24, 0x83, 0x77, 0xd0, 0xd3, 0x74, 0x80, 0x27, - 0x75, 0xd2, 0x26, 0x81, 0xcb, 0x6c, 0x98, 0x3f, 0x6d, 0xca, - 0x3e, 0x99, 0x9a, 0x3d, 0xc9, 0x6e, 0x3c, 0x9b, 0x6f, 0xc8, - 0x69, 0xce, 0x3a, 0x9d, 0xcf, 0x68, 0x9c, 0x3b, 0x38, 0x9f, - 0x6b, 0xcc, 0x9e, 0x39, 0xcd, 0x6a, 0x92, 0x35, 0xc1, 0x66, - 0x34, 0x93, 0x67, 0xc0, 0xc3, 0x64, 0x90, 0x37, 0x65, 0xc2, - 0x36, 0x91, 0x30, 0x97, 0x63, 0xc4, 0x96, 0x31, 0xc5, 0x62, - 0x61, 0xc6, 0x32, 0x95, 0xc7, 0x60, 0x94, 0x33, 0x00, 0xa8, - 0x4d, 0xe5, 0x9a, 0x32, 0xd7, 0x7f, 0x29, 0x81, 0x64, 0xcc, - 0xb3, 0x1b, 0xfe, 0x56, 0x52, 0xfa, 0x1f, 0xb7, 0xc8, 0x60, - 0x85, 0x2d, 0x7b, 0xd3, 0x36, 0x9e, 0xe1, 0x49, 0xac, 0x04, - 0xa4, 0x0c, 0xe9, 0x41, 0x3e, 0x96, 0x73, 0xdb, 0x8d, 0x25, - 0xc0, 0x68, 0x17, 0xbf, 0x5a, 0xf2, 0xf6, 0x5e, 0xbb, 0x13, - 0x6c, 0xc4, 0x21, 0x89, 0xdf, 0x77, 0x92, 0x3a, 0x45, 0xed, - 0x08, 0xa0, 0x55, 0xfd, 0x18, 0xb0, 0xcf, 0x67, 0x82, 0x2a, - 0x7c, 0xd4, 0x31, 0x99, 0xe6, 0x4e, 0xab, 0x03, 0x07, 0xaf, - 0x4a, 0xe2, 0x9d, 0x35, 0xd0, 0x78, 0x2e, 0x86, 0x63, 0xcb, - 0xb4, 0x1c, 0xf9, 0x51, 0xf1, 0x59, 0xbc, 0x14, 0x6b, 0xc3, - 0x26, 0x8e, 0xd8, 0x70, 0x95, 0x3d, 0x42, 0xea, 0x0f, 0xa7, - 0xa3, 0x0b, 0xee, 0x46, 0x39, 0x91, 0x74, 0xdc, 0x8a, 0x22, - 0xc7, 0x6f, 0x10, 0xb8, 0x5d, 0xf5, 0xaa, 0x02, 0xe7, 0x4f, - 0x30, 0x98, 0x7d, 0xd5, 0x83, 0x2b, 0xce, 0x66, 0x19, 0xb1, - 0x54, 0xfc, 0xf8, 0x50, 0xb5, 0x1d, 0x62, 0xca, 0x2f, 0x87, - 0xd1, 0x79, 0x9c, 0x34, 0x4b, 0xe3, 0x06, 0xae, 0x0e, 0xa6, - 0x43, 0xeb, 0x94, 0x3c, 0xd9, 0x71, 0x27, 0x8f, 0x6a, 0xc2, - 0xbd, 0x15, 0xf0, 0x58, 0x5c, 0xf4, 0x11, 0xb9, 0xc6, 0x6e, - 0x8b, 0x23, 0x75, 0xdd, 0x38, 0x90, 0xef, 0x47, 0xa2, 0x0a, - 0xff, 0x57, 0xb2, 0x1a, 0x65, 0xcd, 0x28, 0x80, 0xd6, 0x7e, - 0x9b, 0x33, 0x4c, 0xe4, 0x01, 0xa9, 0xad, 0x05, 0xe0, 0x48, - 0x37, 0x9f, 0x7a, 0xd2, 0x84, 0x2c, 0xc9, 0x61, 0x1e, 0xb6, - 0x53, 0xfb, 0x5b, 0xf3, 0x16, 0xbe, 0xc1, 0x69, 0x8c, 0x24, - 0x72, 0xda, 0x3f, 0x97, 0xe8, 0x40, 0xa5, 0x0d, 0x09, 0xa1, - 0x44, 0xec, 0x93, 0x3b, 0xde, 0x76, 0x20, 0x88, 0x6d, 0xc5, - 0xba, 0x12, 0xf7, 0x5f, 0x00, 0xa9, 0x4f, 0xe6, 0x9e, 0x37, - 0xd1, 0x78, 0x21, 0x88, 0x6e, 0xc7, 0xbf, 0x16, 0xf0, 0x59, - 0x42, 0xeb, 0x0d, 0xa4, 0xdc, 0x75, 0x93, 0x3a, 0x63, 0xca, - 0x2c, 0x85, 0xfd, 0x54, 0xb2, 0x1b, 0x84, 0x2d, 0xcb, 0x62, - 0x1a, 0xb3, 0x55, 0xfc, 0xa5, 0x0c, 0xea, 0x43, 0x3b, 0x92, - 0x74, 0xdd, 0xc6, 0x6f, 0x89, 0x20, 0x58, 0xf1, 0x17, 0xbe, - 0xe7, 0x4e, 0xa8, 0x01, 0x79, 0xd0, 0x36, 0x9f, 0x15, 0xbc, - 0x5a, 0xf3, 0x8b, 0x22, 0xc4, 0x6d, 0x34, 0x9d, 0x7b, 0xd2, - 0xaa, 0x03, 0xe5, 0x4c, 0x57, 0xfe, 0x18, 0xb1, 0xc9, 0x60, - 0x86, 0x2f, 0x76, 0xdf, 0x39, 0x90, 0xe8, 0x41, 0xa7, 0x0e, - 0x91, 0x38, 0xde, 0x77, 0x0f, 0xa6, 0x40, 0xe9, 0xb0, 0x19, - 0xff, 0x56, 0x2e, 0x87, 0x61, 0xc8, 0xd3, 0x7a, 0x9c, 0x35, - 0x4d, 0xe4, 0x02, 0xab, 0xf2, 0x5b, 0xbd, 0x14, 0x6c, 0xc5, - 0x23, 0x8a, 0x2a, 0x83, 0x65, 0xcc, 0xb4, 0x1d, 0xfb, 0x52, - 0x0b, 0xa2, 0x44, 0xed, 0x95, 0x3c, 0xda, 0x73, 0x68, 0xc1, - 0x27, 0x8e, 0xf6, 0x5f, 0xb9, 0x10, 0x49, 0xe0, 0x06, 0xaf, - 0xd7, 0x7e, 0x98, 0x31, 0xae, 0x07, 0xe1, 0x48, 0x30, 0x99, - 0x7f, 0xd6, 0x8f, 0x26, 0xc0, 0x69, 0x11, 0xb8, 0x5e, 0xf7, - 0xec, 0x45, 0xa3, 0x0a, 0x72, 0xdb, 0x3d, 0x94, 0xcd, 0x64, - 0x82, 0x2b, 0x53, 0xfa, 0x1c, 0xb5, 0x3f, 0x96, 0x70, 0xd9, - 0xa1, 0x08, 0xee, 0x47, 0x1e, 0xb7, 0x51, 0xf8, 0x80, 0x29, - 0xcf, 0x66, 0x7d, 0xd4, 0x32, 0x9b, 0xe3, 0x4a, 0xac, 0x05, - 0x5c, 0xf5, 0x13, 0xba, 0xc2, 0x6b, 0x8d, 0x24, 0xbb, 0x12, - 0xf4, 0x5d, 0x25, 0x8c, 0x6a, 0xc3, 0x9a, 0x33, 0xd5, 0x7c, - 0x04, 0xad, 0x4b, 0xe2, 0xf9, 0x50, 0xb6, 0x1f, 0x67, 0xce, - 0x28, 0x81, 0xd8, 0x71, 0x97, 0x3e, 0x46, 0xef, 0x09, 0xa0, - 0x00, 0xaa, 0x49, 0xe3, 0x92, 0x38, 0xdb, 0x71, 0x39, 0x93, - 0x70, 0xda, 0xab, 0x01, 0xe2, 0x48, 0x72, 0xd8, 0x3b, 0x91, - 0xe0, 0x4a, 0xa9, 0x03, 0x4b, 0xe1, 0x02, 0xa8, 0xd9, 0x73, - 0x90, 0x3a, 0xe4, 0x4e, 0xad, 0x07, 0x76, 0xdc, 0x3f, 0x95, - 0xdd, 0x77, 0x94, 0x3e, 0x4f, 0xe5, 0x06, 0xac, 0x96, 0x3c, - 0xdf, 0x75, 0x04, 0xae, 0x4d, 0xe7, 0xaf, 0x05, 0xe6, 0x4c, - 0x3d, 0x97, 0x74, 0xde, 0xd5, 0x7f, 0x9c, 0x36, 0x47, 0xed, - 0x0e, 0xa4, 0xec, 0x46, 0xa5, 0x0f, 0x7e, 0xd4, 0x37, 0x9d, - 0xa7, 0x0d, 0xee, 0x44, 0x35, 0x9f, 0x7c, 0xd6, 0x9e, 0x34, - 0xd7, 0x7d, 0x0c, 0xa6, 0x45, 0xef, 0x31, 0x9b, 0x78, 0xd2, - 0xa3, 0x09, 0xea, 0x40, 0x08, 0xa2, 0x41, 0xeb, 0x9a, 0x30, - 0xd3, 0x79, 0x43, 0xe9, 0x0a, 0xa0, 0xd1, 0x7b, 0x98, 0x32, - 0x7a, 0xd0, 0x33, 0x99, 0xe8, 0x42, 0xa1, 0x0b, 0xb7, 0x1d, - 0xfe, 0x54, 0x25, 0x8f, 0x6c, 0xc6, 0x8e, 0x24, 0xc7, 0x6d, - 0x1c, 0xb6, 0x55, 0xff, 0xc5, 0x6f, 0x8c, 0x26, 0x57, 0xfd, - 0x1e, 0xb4, 0xfc, 0x56, 0xb5, 0x1f, 0x6e, 0xc4, 0x27, 0x8d, - 0x53, 0xf9, 0x1a, 0xb0, 0xc1, 0x6b, 0x88, 0x22, 0x6a, 0xc0, - 0x23, 0x89, 0xf8, 0x52, 0xb1, 0x1b, 0x21, 0x8b, 0x68, 0xc2, - 0xb3, 0x19, 0xfa, 0x50, 0x18, 0xb2, 0x51, 0xfb, 0x8a, 0x20, - 0xc3, 0x69, 0x62, 0xc8, 0x2b, 0x81, 0xf0, 0x5a, 0xb9, 0x13, - 0x5b, 0xf1, 0x12, 0xb8, 0xc9, 0x63, 0x80, 0x2a, 0x10, 0xba, - 0x59, 0xf3, 0x82, 0x28, 0xcb, 0x61, 0x29, 0x83, 0x60, 0xca, - 0xbb, 0x11, 0xf2, 0x58, 0x86, 0x2c, 0xcf, 0x65, 0x14, 0xbe, - 0x5d, 0xf7, 0xbf, 0x15, 0xf6, 0x5c, 0x2d, 0x87, 0x64, 0xce, - 0xf4, 0x5e, 0xbd, 0x17, 0x66, 0xcc, 0x2f, 0x85, 0xcd, 0x67, - 0x84, 0x2e, 0x5f, 0xf5, 0x16, 0xbc, 0x00, 0xab, 0x4b, 0xe0, - 0x96, 0x3d, 0xdd, 0x76, 0x31, 0x9a, 0x7a, 0xd1, 0xa7, 0x0c, - 0xec, 0x47, 0x62, 0xc9, 0x29, 0x82, 0xf4, 0x5f, 0xbf, 0x14, - 0x53, 0xf8, 0x18, 0xb3, 0xc5, 0x6e, 0x8e, 0x25, 0xc4, 0x6f, - 0x8f, 0x24, 0x52, 0xf9, 0x19, 0xb2, 0xf5, 0x5e, 0xbe, 0x15, - 0x63, 0xc8, 0x28, 0x83, 0xa6, 0x0d, 0xed, 0x46, 0x30, 0x9b, - 0x7b, 0xd0, 0x97, 0x3c, 0xdc, 0x77, 0x01, 0xaa, 0x4a, 0xe1, - 0x95, 0x3e, 0xde, 0x75, 0x03, 0xa8, 0x48, 0xe3, 0xa4, 0x0f, - 0xef, 0x44, 0x32, 0x99, 0x79, 0xd2, 0xf7, 0x5c, 0xbc, 0x17, - 0x61, 0xca, 0x2a, 0x81, 0xc6, 0x6d, 0x8d, 0x26, 0x50, 0xfb, - 0x1b, 0xb0, 0x51, 0xfa, 0x1a, 0xb1, 0xc7, 0x6c, 0x8c, 0x27, - 0x60, 0xcb, 0x2b, 0x80, 0xf6, 0x5d, 0xbd, 0x16, 0x33, 0x98, - 0x78, 0xd3, 0xa5, 0x0e, 0xee, 0x45, 0x02, 0xa9, 0x49, 0xe2, - 0x94, 0x3f, 0xdf, 0x74, 0x37, 0x9c, 0x7c, 0xd7, 0xa1, 0x0a, - 0xea, 0x41, 0x06, 0xad, 0x4d, 0xe6, 0x90, 0x3b, 0xdb, 0x70, - 0x55, 0xfe, 0x1e, 0xb5, 0xc3, 0x68, 0x88, 0x23, 0x64, 0xcf, - 0x2f, 0x84, 0xf2, 0x59, 0xb9, 0x12, 0xf3, 0x58, 0xb8, 0x13, - 0x65, 0xce, 0x2e, 0x85, 0xc2, 0x69, 0x89, 0x22, 0x54, 0xff, - 0x1f, 0xb4, 0x91, 0x3a, 0xda, 0x71, 0x07, 0xac, 0x4c, 0xe7, - 0xa0, 0x0b, 0xeb, 0x40, 0x36, 0x9d, 0x7d, 0xd6, 0xa2, 0x09, - 0xe9, 0x42, 0x34, 0x9f, 0x7f, 0xd4, 0x93, 0x38, 0xd8, 0x73, - 0x05, 0xae, 0x4e, 0xe5, 0xc0, 0x6b, 0x8b, 0x20, 0x56, 0xfd, - 0x1d, 0xb6, 0xf1, 0x5a, 0xba, 0x11, 0x67, 0xcc, 0x2c, 0x87, - 0x66, 0xcd, 0x2d, 0x86, 0xf0, 0x5b, 0xbb, 0x10, 0x57, 0xfc, - 0x1c, 0xb7, 0xc1, 0x6a, 0x8a, 0x21, 0x04, 0xaf, 0x4f, 0xe4, - 0x92, 0x39, 0xd9, 0x72, 0x35, 0x9e, 0x7e, 0xd5, 0xa3, 0x08, - 0xe8, 0x43, 0x00, 0xac, 0x45, 0xe9, 0x8a, 0x26, 0xcf, 0x63, - 0x09, 0xa5, 0x4c, 0xe0, 0x83, 0x2f, 0xc6, 0x6a, 0x12, 0xbe, - 0x57, 0xfb, 0x98, 0x34, 0xdd, 0x71, 0x1b, 0xb7, 0x5e, 0xf2, - 0x91, 0x3d, 0xd4, 0x78, 0x24, 0x88, 0x61, 0xcd, 0xae, 0x02, - 0xeb, 0x47, 0x2d, 0x81, 0x68, 0xc4, 0xa7, 0x0b, 0xe2, 0x4e, - 0x36, 0x9a, 0x73, 0xdf, 0xbc, 0x10, 0xf9, 0x55, 0x3f, 0x93, - 0x7a, 0xd6, 0xb5, 0x19, 0xf0, 0x5c, 0x48, 0xe4, 0x0d, 0xa1, - 0xc2, 0x6e, 0x87, 0x2b, 0x41, 0xed, 0x04, 0xa8, 0xcb, 0x67, - 0x8e, 0x22, 0x5a, 0xf6, 0x1f, 0xb3, 0xd0, 0x7c, 0x95, 0x39, - 0x53, 0xff, 0x16, 0xba, 0xd9, 0x75, 0x9c, 0x30, 0x6c, 0xc0, - 0x29, 0x85, 0xe6, 0x4a, 0xa3, 0x0f, 0x65, 0xc9, 0x20, 0x8c, - 0xef, 0x43, 0xaa, 0x06, 0x7e, 0xd2, 0x3b, 0x97, 0xf4, 0x58, - 0xb1, 0x1d, 0x77, 0xdb, 0x32, 0x9e, 0xfd, 0x51, 0xb8, 0x14, - 0x90, 0x3c, 0xd5, 0x79, 0x1a, 0xb6, 0x5f, 0xf3, 0x99, 0x35, - 0xdc, 0x70, 0x13, 0xbf, 0x56, 0xfa, 0x82, 0x2e, 0xc7, 0x6b, - 0x08, 0xa4, 0x4d, 0xe1, 0x8b, 0x27, 0xce, 0x62, 0x01, 0xad, - 0x44, 0xe8, 0xb4, 0x18, 0xf1, 0x5d, 0x3e, 0x92, 0x7b, 0xd7, - 0xbd, 0x11, 0xf8, 0x54, 0x37, 0x9b, 0x72, 0xde, 0xa6, 0x0a, - 0xe3, 0x4f, 0x2c, 0x80, 0x69, 0xc5, 0xaf, 0x03, 0xea, 0x46, - 0x25, 0x89, 0x60, 0xcc, 0xd8, 0x74, 0x9d, 0x31, 0x52, 0xfe, - 0x17, 0xbb, 0xd1, 0x7d, 0x94, 0x38, 0x5b, 0xf7, 0x1e, 0xb2, - 0xca, 0x66, 0x8f, 0x23, 0x40, 0xec, 0x05, 0xa9, 0xc3, 0x6f, - 0x86, 0x2a, 0x49, 0xe5, 0x0c, 0xa0, 0xfc, 0x50, 0xb9, 0x15, - 0x76, 0xda, 0x33, 0x9f, 0xf5, 0x59, 0xb0, 0x1c, 0x7f, 0xd3, - 0x3a, 0x96, 0xee, 0x42, 0xab, 0x07, 0x64, 0xc8, 0x21, 0x8d, - 0xe7, 0x4b, 0xa2, 0x0e, 0x6d, 0xc1, 0x28, 0x84, 0x00, 0xad, - 0x47, 0xea, 0x8e, 0x23, 0xc9, 0x64, 0x01, 0xac, 0x46, 0xeb, - 0x8f, 0x22, 0xc8, 0x65, 0x02, 0xaf, 0x45, 0xe8, 0x8c, 0x21, - 0xcb, 0x66, 0x03, 0xae, 0x44, 0xe9, 0x8d, 0x20, 0xca, 0x67, - 0x04, 0xa9, 0x43, 0xee, 0x8a, 0x27, 0xcd, 0x60, 0x05, 0xa8, - 0x42, 0xef, 0x8b, 0x26, 0xcc, 0x61, 0x06, 0xab, 0x41, 0xec, - 0x88, 0x25, 0xcf, 0x62, 0x07, 0xaa, 0x40, 0xed, 0x89, 0x24, - 0xce, 0x63, 0x08, 0xa5, 0x4f, 0xe2, 0x86, 0x2b, 0xc1, 0x6c, - 0x09, 0xa4, 0x4e, 0xe3, 0x87, 0x2a, 0xc0, 0x6d, 0x0a, 0xa7, - 0x4d, 0xe0, 0x84, 0x29, 0xc3, 0x6e, 0x0b, 0xa6, 0x4c, 0xe1, - 0x85, 0x28, 0xc2, 0x6f, 0x0c, 0xa1, 0x4b, 0xe6, 0x82, 0x2f, - 0xc5, 0x68, 0x0d, 0xa0, 0x4a, 0xe7, 0x83, 0x2e, 0xc4, 0x69, - 0x0e, 0xa3, 0x49, 0xe4, 0x80, 0x2d, 0xc7, 0x6a, 0x0f, 0xa2, - 0x48, 0xe5, 0x81, 0x2c, 0xc6, 0x6b, 0x10, 0xbd, 0x57, 0xfa, - 0x9e, 0x33, 0xd9, 0x74, 0x11, 0xbc, 0x56, 0xfb, 0x9f, 0x32, - 0xd8, 0x75, 0x12, 0xbf, 0x55, 0xf8, 0x9c, 0x31, 0xdb, 0x76, - 0x13, 0xbe, 0x54, 0xf9, 0x9d, 0x30, 0xda, 0x77, 0x14, 0xb9, - 0x53, 0xfe, 0x9a, 0x37, 0xdd, 0x70, 0x15, 0xb8, 0x52, 0xff, - 0x9b, 0x36, 0xdc, 0x71, 0x16, 0xbb, 0x51, 0xfc, 0x98, 0x35, - 0xdf, 0x72, 0x17, 0xba, 0x50, 0xfd, 0x99, 0x34, 0xde, 0x73, - 0x18, 0xb5, 0x5f, 0xf2, 0x96, 0x3b, 0xd1, 0x7c, 0x19, 0xb4, - 0x5e, 0xf3, 0x97, 0x3a, 0xd0, 0x7d, 0x1a, 0xb7, 0x5d, 0xf0, - 0x94, 0x39, 0xd3, 0x7e, 0x1b, 0xb6, 0x5c, 0xf1, 0x95, 0x38, - 0xd2, 0x7f, 0x1c, 0xb1, 0x5b, 0xf6, 0x92, 0x3f, 0xd5, 0x78, - 0x1d, 0xb0, 0x5a, 0xf7, 0x93, 0x3e, 0xd4, 0x79, 0x1e, 0xb3, - 0x59, 0xf4, 0x90, 0x3d, 0xd7, 0x7a, 0x1f, 0xb2, 0x58, 0xf5, - 0x91, 0x3c, 0xd6, 0x7b, 0x00, 0xae, 0x41, 0xef, 0x82, 0x2c, - 0xc3, 0x6d, 0x19, 0xb7, 0x58, 0xf6, 0x9b, 0x35, 0xda, 0x74, - 0x32, 0x9c, 0x73, 0xdd, 0xb0, 0x1e, 0xf1, 0x5f, 0x2b, 0x85, - 0x6a, 0xc4, 0xa9, 0x07, 0xe8, 0x46, 0x64, 0xca, 0x25, 0x8b, - 0xe6, 0x48, 0xa7, 0x09, 0x7d, 0xd3, 0x3c, 0x92, 0xff, 0x51, - 0xbe, 0x10, 0x56, 0xf8, 0x17, 0xb9, 0xd4, 0x7a, 0x95, 0x3b, - 0x4f, 0xe1, 0x0e, 0xa0, 0xcd, 0x63, 0x8c, 0x22, 0xc8, 0x66, - 0x89, 0x27, 0x4a, 0xe4, 0x0b, 0xa5, 0xd1, 0x7f, 0x90, 0x3e, - 0x53, 0xfd, 0x12, 0xbc, 0xfa, 0x54, 0xbb, 0x15, 0x78, 0xd6, - 0x39, 0x97, 0xe3, 0x4d, 0xa2, 0x0c, 0x61, 0xcf, 0x20, 0x8e, - 0xac, 0x02, 0xed, 0x43, 0x2e, 0x80, 0x6f, 0xc1, 0xb5, 0x1b, - 0xf4, 0x5a, 0x37, 0x99, 0x76, 0xd8, 0x9e, 0x30, 0xdf, 0x71, - 0x1c, 0xb2, 0x5d, 0xf3, 0x87, 0x29, 0xc6, 0x68, 0x05, 0xab, - 0x44, 0xea, 0x8d, 0x23, 0xcc, 0x62, 0x0f, 0xa1, 0x4e, 0xe0, - 0x94, 0x3a, 0xd5, 0x7b, 0x16, 0xb8, 0x57, 0xf9, 0xbf, 0x11, - 0xfe, 0x50, 0x3d, 0x93, 0x7c, 0xd2, 0xa6, 0x08, 0xe7, 0x49, - 0x24, 0x8a, 0x65, 0xcb, 0xe9, 0x47, 0xa8, 0x06, 0x6b, 0xc5, - 0x2a, 0x84, 0xf0, 0x5e, 0xb1, 0x1f, 0x72, 0xdc, 0x33, 0x9d, - 0xdb, 0x75, 0x9a, 0x34, 0x59, 0xf7, 0x18, 0xb6, 0xc2, 0x6c, - 0x83, 0x2d, 0x40, 0xee, 0x01, 0xaf, 0x45, 0xeb, 0x04, 0xaa, - 0xc7, 0x69, 0x86, 0x28, 0x5c, 0xf2, 0x1d, 0xb3, 0xde, 0x70, - 0x9f, 0x31, 0x77, 0xd9, 0x36, 0x98, 0xf5, 0x5b, 0xb4, 0x1a, - 0x6e, 0xc0, 0x2f, 0x81, 0xec, 0x42, 0xad, 0x03, 0x21, 0x8f, - 0x60, 0xce, 0xa3, 0x0d, 0xe2, 0x4c, 0x38, 0x96, 0x79, 0xd7, - 0xba, 0x14, 0xfb, 0x55, 0x13, 0xbd, 0x52, 0xfc, 0x91, 0x3f, - 0xd0, 0x7e, 0x0a, 0xa4, 0x4b, 0xe5, 0x88, 0x26, 0xc9, 0x67, - 0x00, 0xaf, 0x43, 0xec, 0x86, 0x29, 0xc5, 0x6a, 0x11, 0xbe, - 0x52, 0xfd, 0x97, 0x38, 0xd4, 0x7b, 0x22, 0x8d, 0x61, 0xce, - 0xa4, 0x0b, 0xe7, 0x48, 0x33, 0x9c, 0x70, 0xdf, 0xb5, 0x1a, - 0xf6, 0x59, 0x44, 0xeb, 0x07, 0xa8, 0xc2, 0x6d, 0x81, 0x2e, - 0x55, 0xfa, 0x16, 0xb9, 0xd3, 0x7c, 0x90, 0x3f, 0x66, 0xc9, - 0x25, 0x8a, 0xe0, 0x4f, 0xa3, 0x0c, 0x77, 0xd8, 0x34, 0x9b, - 0xf1, 0x5e, 0xb2, 0x1d, 0x88, 0x27, 0xcb, 0x64, 0x0e, 0xa1, - 0x4d, 0xe2, 0x99, 0x36, 0xda, 0x75, 0x1f, 0xb0, 0x5c, 0xf3, - 0xaa, 0x05, 0xe9, 0x46, 0x2c, 0x83, 0x6f, 0xc0, 0xbb, 0x14, - 0xf8, 0x57, 0x3d, 0x92, 0x7e, 0xd1, 0xcc, 0x63, 0x8f, 0x20, - 0x4a, 0xe5, 0x09, 0xa6, 0xdd, 0x72, 0x9e, 0x31, 0x5b, 0xf4, - 0x18, 0xb7, 0xee, 0x41, 0xad, 0x02, 0x68, 0xc7, 0x2b, 0x84, - 0xff, 0x50, 0xbc, 0x13, 0x79, 0xd6, 0x3a, 0x95, 0x0d, 0xa2, - 0x4e, 0xe1, 0x8b, 0x24, 0xc8, 0x67, 0x1c, 0xb3, 0x5f, 0xf0, - 0x9a, 0x35, 0xd9, 0x76, 0x2f, 0x80, 0x6c, 0xc3, 0xa9, 0x06, - 0xea, 0x45, 0x3e, 0x91, 0x7d, 0xd2, 0xb8, 0x17, 0xfb, 0x54, - 0x49, 0xe6, 0x0a, 0xa5, 0xcf, 0x60, 0x8c, 0x23, 0x58, 0xf7, - 0x1b, 0xb4, 0xde, 0x71, 0x9d, 0x32, 0x6b, 0xc4, 0x28, 0x87, - 0xed, 0x42, 0xae, 0x01, 0x7a, 0xd5, 0x39, 0x96, 0xfc, 0x53, - 0xbf, 0x10, 0x85, 0x2a, 0xc6, 0x69, 0x03, 0xac, 0x40, 0xef, - 0x94, 0x3b, 0xd7, 0x78, 0x12, 0xbd, 0x51, 0xfe, 0xa7, 0x08, - 0xe4, 0x4b, 0x21, 0x8e, 0x62, 0xcd, 0xb6, 0x19, 0xf5, 0x5a, - 0x30, 0x9f, 0x73, 0xdc, 0xc1, 0x6e, 0x82, 0x2d, 0x47, 0xe8, - 0x04, 0xab, 0xd0, 0x7f, 0x93, 0x3c, 0x56, 0xf9, 0x15, 0xba, - 0xe3, 0x4c, 0xa0, 0x0f, 0x65, 0xca, 0x26, 0x89, 0xf2, 0x5d, - 0xb1, 0x1e, 0x74, 0xdb, 0x37, 0x98, 0x00, 0xb0, 0x7d, 0xcd, - 0xfa, 0x4a, 0x87, 0x37, 0xe9, 0x59, 0x94, 0x24, 0x13, 0xa3, - 0x6e, 0xde, 0xcf, 0x7f, 0xb2, 0x02, 0x35, 0x85, 0x48, 0xf8, - 0x26, 0x96, 0x5b, 0xeb, 0xdc, 0x6c, 0xa1, 0x11, 0x83, 0x33, - 0xfe, 0x4e, 0x79, 0xc9, 0x04, 0xb4, 0x6a, 0xda, 0x17, 0xa7, - 0x90, 0x20, 0xed, 0x5d, 0x4c, 0xfc, 0x31, 0x81, 0xb6, 0x06, - 0xcb, 0x7b, 0xa5, 0x15, 0xd8, 0x68, 0x5f, 0xef, 0x22, 0x92, - 0x1b, 0xab, 0x66, 0xd6, 0xe1, 0x51, 0x9c, 0x2c, 0xf2, 0x42, - 0x8f, 0x3f, 0x08, 0xb8, 0x75, 0xc5, 0xd4, 0x64, 0xa9, 0x19, - 0x2e, 0x9e, 0x53, 0xe3, 0x3d, 0x8d, 0x40, 0xf0, 0xc7, 0x77, - 0xba, 0x0a, 0x98, 0x28, 0xe5, 0x55, 0x62, 0xd2, 0x1f, 0xaf, - 0x71, 0xc1, 0x0c, 0xbc, 0x8b, 0x3b, 0xf6, 0x46, 0x57, 0xe7, - 0x2a, 0x9a, 0xad, 0x1d, 0xd0, 0x60, 0xbe, 0x0e, 0xc3, 0x73, - 0x44, 0xf4, 0x39, 0x89, 0x36, 0x86, 0x4b, 0xfb, 0xcc, 0x7c, - 0xb1, 0x01, 0xdf, 0x6f, 0xa2, 0x12, 0x25, 0x95, 0x58, 0xe8, - 0xf9, 0x49, 0x84, 0x34, 0x03, 0xb3, 0x7e, 0xce, 0x10, 0xa0, - 0x6d, 0xdd, 0xea, 0x5a, 0x97, 0x27, 0xb5, 0x05, 0xc8, 0x78, - 0x4f, 0xff, 0x32, 0x82, 0x5c, 0xec, 0x21, 0x91, 0xa6, 0x16, - 0xdb, 0x6b, 0x7a, 0xca, 0x07, 0xb7, 0x80, 0x30, 0xfd, 0x4d, - 0x93, 0x23, 0xee, 0x5e, 0x69, 0xd9, 0x14, 0xa4, 0x2d, 0x9d, - 0x50, 0xe0, 0xd7, 0x67, 0xaa, 0x1a, 0xc4, 0x74, 0xb9, 0x09, - 0x3e, 0x8e, 0x43, 0xf3, 0xe2, 0x52, 0x9f, 0x2f, 0x18, 0xa8, - 0x65, 0xd5, 0x0b, 0xbb, 0x76, 0xc6, 0xf1, 0x41, 0x8c, 0x3c, - 0xae, 0x1e, 0xd3, 0x63, 0x54, 0xe4, 0x29, 0x99, 0x47, 0xf7, - 0x3a, 0x8a, 0xbd, 0x0d, 0xc0, 0x70, 0x61, 0xd1, 0x1c, 0xac, - 0x9b, 0x2b, 0xe6, 0x56, 0x88, 0x38, 0xf5, 0x45, 0x72, 0xc2, - 0x0f, 0xbf, 0x00, 0xb1, 0x7f, 0xce, 0xfe, 0x4f, 0x81, 0x30, - 0xe1, 0x50, 0x9e, 0x2f, 0x1f, 0xae, 0x60, 0xd1, 0xdf, 0x6e, - 0xa0, 0x11, 0x21, 0x90, 0x5e, 0xef, 0x3e, 0x8f, 0x41, 0xf0, - 0xc0, 0x71, 0xbf, 0x0e, 0xa3, 0x12, 0xdc, 0x6d, 0x5d, 0xec, - 0x22, 0x93, 0x42, 0xf3, 0x3d, 0x8c, 0xbc, 0x0d, 0xc3, 0x72, - 0x7c, 0xcd, 0x03, 0xb2, 0x82, 0x33, 0xfd, 0x4c, 0x9d, 0x2c, - 0xe2, 0x53, 0x63, 0xd2, 0x1c, 0xad, 0x5b, 0xea, 0x24, 0x95, - 0xa5, 0x14, 0xda, 0x6b, 0xba, 0x0b, 0xc5, 0x74, 0x44, 0xf5, - 0x3b, 0x8a, 0x84, 0x35, 0xfb, 0x4a, 0x7a, 0xcb, 0x05, 0xb4, - 0x65, 0xd4, 0x1a, 0xab, 0x9b, 0x2a, 0xe4, 0x55, 0xf8, 0x49, - 0x87, 0x36, 0x06, 0xb7, 0x79, 0xc8, 0x19, 0xa8, 0x66, 0xd7, - 0xe7, 0x56, 0x98, 0x29, 0x27, 0x96, 0x58, 0xe9, 0xd9, 0x68, - 0xa6, 0x17, 0xc6, 0x77, 0xb9, 0x08, 0x38, 0x89, 0x47, 0xf6, - 0xb6, 0x07, 0xc9, 0x78, 0x48, 0xf9, 0x37, 0x86, 0x57, 0xe6, - 0x28, 0x99, 0xa9, 0x18, 0xd6, 0x67, 0x69, 0xd8, 0x16, 0xa7, - 0x97, 0x26, 0xe8, 0x59, 0x88, 0x39, 0xf7, 0x46, 0x76, 0xc7, - 0x09, 0xb8, 0x15, 0xa4, 0x6a, 0xdb, 0xeb, 0x5a, 0x94, 0x25, - 0xf4, 0x45, 0x8b, 0x3a, 0x0a, 0xbb, 0x75, 0xc4, 0xca, 0x7b, - 0xb5, 0x04, 0x34, 0x85, 0x4b, 0xfa, 0x2b, 0x9a, 0x54, 0xe5, - 0xd5, 0x64, 0xaa, 0x1b, 0xed, 0x5c, 0x92, 0x23, 0x13, 0xa2, - 0x6c, 0xdd, 0x0c, 0xbd, 0x73, 0xc2, 0xf2, 0x43, 0x8d, 0x3c, - 0x32, 0x83, 0x4d, 0xfc, 0xcc, 0x7d, 0xb3, 0x02, 0xd3, 0x62, - 0xac, 0x1d, 0x2d, 0x9c, 0x52, 0xe3, 0x4e, 0xff, 0x31, 0x80, - 0xb0, 0x01, 0xcf, 0x7e, 0xaf, 0x1e, 0xd0, 0x61, 0x51, 0xe0, - 0x2e, 0x9f, 0x91, 0x20, 0xee, 0x5f, 0x6f, 0xde, 0x10, 0xa1, - 0x70, 0xc1, 0x0f, 0xbe, 0x8e, 0x3f, 0xf1, 0x40, 0x00, 0xb2, - 0x79, 0xcb, 0xf2, 0x40, 0x8b, 0x39, 0xf9, 0x4b, 0x80, 0x32, - 0x0b, 0xb9, 0x72, 0xc0, 0xef, 0x5d, 0x96, 0x24, 0x1d, 0xaf, - 0x64, 0xd6, 0x16, 0xa4, 0x6f, 0xdd, 0xe4, 0x56, 0x9d, 0x2f, - 0xc3, 0x71, 0xba, 0x08, 0x31, 0x83, 0x48, 0xfa, 0x3a, 0x88, - 0x43, 0xf1, 0xc8, 0x7a, 0xb1, 0x03, 0x2c, 0x9e, 0x55, 0xe7, - 0xde, 0x6c, 0xa7, 0x15, 0xd5, 0x67, 0xac, 0x1e, 0x27, 0x95, - 0x5e, 0xec, 0x9b, 0x29, 0xe2, 0x50, 0x69, 0xdb, 0x10, 0xa2, - 0x62, 0xd0, 0x1b, 0xa9, 0x90, 0x22, 0xe9, 0x5b, 0x74, 0xc6, - 0x0d, 0xbf, 0x86, 0x34, 0xff, 0x4d, 0x8d, 0x3f, 0xf4, 0x46, - 0x7f, 0xcd, 0x06, 0xb4, 0x58, 0xea, 0x21, 0x93, 0xaa, 0x18, - 0xd3, 0x61, 0xa1, 0x13, 0xd8, 0x6a, 0x53, 0xe1, 0x2a, 0x98, - 0xb7, 0x05, 0xce, 0x7c, 0x45, 0xf7, 0x3c, 0x8e, 0x4e, 0xfc, - 0x37, 0x85, 0xbc, 0x0e, 0xc5, 0x77, 0x2b, 0x99, 0x52, 0xe0, - 0xd9, 0x6b, 0xa0, 0x12, 0xd2, 0x60, 0xab, 0x19, 0x20, 0x92, - 0x59, 0xeb, 0xc4, 0x76, 0xbd, 0x0f, 0x36, 0x84, 0x4f, 0xfd, - 0x3d, 0x8f, 0x44, 0xf6, 0xcf, 0x7d, 0xb6, 0x04, 0xe8, 0x5a, - 0x91, 0x23, 0x1a, 0xa8, 0x63, 0xd1, 0x11, 0xa3, 0x68, 0xda, - 0xe3, 0x51, 0x9a, 0x28, 0x07, 0xb5, 0x7e, 0xcc, 0xf5, 0x47, - 0x8c, 0x3e, 0xfe, 0x4c, 0x87, 0x35, 0x0c, 0xbe, 0x75, 0xc7, - 0xb0, 0x02, 0xc9, 0x7b, 0x42, 0xf0, 0x3b, 0x89, 0x49, 0xfb, - 0x30, 0x82, 0xbb, 0x09, 0xc2, 0x70, 0x5f, 0xed, 0x26, 0x94, - 0xad, 0x1f, 0xd4, 0x66, 0xa6, 0x14, 0xdf, 0x6d, 0x54, 0xe6, - 0x2d, 0x9f, 0x73, 0xc1, 0x0a, 0xb8, 0x81, 0x33, 0xf8, 0x4a, - 0x8a, 0x38, 0xf3, 0x41, 0x78, 0xca, 0x01, 0xb3, 0x9c, 0x2e, - 0xe5, 0x57, 0x6e, 0xdc, 0x17, 0xa5, 0x65, 0xd7, 0x1c, 0xae, - 0x97, 0x25, 0xee, 0x5c, 0x00, 0xb3, 0x7b, 0xc8, 0xf6, 0x45, - 0x8d, 0x3e, 0xf1, 0x42, 0x8a, 0x39, 0x07, 0xb4, 0x7c, 0xcf, - 0xff, 0x4c, 0x84, 0x37, 0x09, 0xba, 0x72, 0xc1, 0x0e, 0xbd, - 0x75, 0xc6, 0xf8, 0x4b, 0x83, 0x30, 0xe3, 0x50, 0x98, 0x2b, - 0x15, 0xa6, 0x6e, 0xdd, 0x12, 0xa1, 0x69, 0xda, 0xe4, 0x57, - 0x9f, 0x2c, 0x1c, 0xaf, 0x67, 0xd4, 0xea, 0x59, 0x91, 0x22, - 0xed, 0x5e, 0x96, 0x25, 0x1b, 0xa8, 0x60, 0xd3, 0xdb, 0x68, - 0xa0, 0x13, 0x2d, 0x9e, 0x56, 0xe5, 0x2a, 0x99, 0x51, 0xe2, - 0xdc, 0x6f, 0xa7, 0x14, 0x24, 0x97, 0x5f, 0xec, 0xd2, 0x61, - 0xa9, 0x1a, 0xd5, 0x66, 0xae, 0x1d, 0x23, 0x90, 0x58, 0xeb, - 0x38, 0x8b, 0x43, 0xf0, 0xce, 0x7d, 0xb5, 0x06, 0xc9, 0x7a, - 0xb2, 0x01, 0x3f, 0x8c, 0x44, 0xf7, 0xc7, 0x74, 0xbc, 0x0f, - 0x31, 0x82, 0x4a, 0xf9, 0x36, 0x85, 0x4d, 0xfe, 0xc0, 0x73, - 0xbb, 0x08, 0xab, 0x18, 0xd0, 0x63, 0x5d, 0xee, 0x26, 0x95, - 0x5a, 0xe9, 0x21, 0x92, 0xac, 0x1f, 0xd7, 0x64, 0x54, 0xe7, - 0x2f, 0x9c, 0xa2, 0x11, 0xd9, 0x6a, 0xa5, 0x16, 0xde, 0x6d, - 0x53, 0xe0, 0x28, 0x9b, 0x48, 0xfb, 0x33, 0x80, 0xbe, 0x0d, - 0xc5, 0x76, 0xb9, 0x0a, 0xc2, 0x71, 0x4f, 0xfc, 0x34, 0x87, - 0xb7, 0x04, 0xcc, 0x7f, 0x41, 0xf2, 0x3a, 0x89, 0x46, 0xf5, - 0x3d, 0x8e, 0xb0, 0x03, 0xcb, 0x78, 0x70, 0xc3, 0x0b, 0xb8, - 0x86, 0x35, 0xfd, 0x4e, 0x81, 0x32, 0xfa, 0x49, 0x77, 0xc4, - 0x0c, 0xbf, 0x8f, 0x3c, 0xf4, 0x47, 0x79, 0xca, 0x02, 0xb1, - 0x7e, 0xcd, 0x05, 0xb6, 0x88, 0x3b, 0xf3, 0x40, 0x93, 0x20, - 0xe8, 0x5b, 0x65, 0xd6, 0x1e, 0xad, 0x62, 0xd1, 0x19, 0xaa, - 0x94, 0x27, 0xef, 0x5c, 0x6c, 0xdf, 0x17, 0xa4, 0x9a, 0x29, - 0xe1, 0x52, 0x9d, 0x2e, 0xe6, 0x55, 0x6b, 0xd8, 0x10, 0xa3, - 0x00, 0xb4, 0x75, 0xc1, 0xea, 0x5e, 0x9f, 0x2b, 0xc9, 0x7d, - 0xbc, 0x08, 0x23, 0x97, 0x56, 0xe2, 0x8f, 0x3b, 0xfa, 0x4e, - 0x65, 0xd1, 0x10, 0xa4, 0x46, 0xf2, 0x33, 0x87, 0xac, 0x18, - 0xd9, 0x6d, 0x03, 0xb7, 0x76, 0xc2, 0xe9, 0x5d, 0x9c, 0x28, - 0xca, 0x7e, 0xbf, 0x0b, 0x20, 0x94, 0x55, 0xe1, 0x8c, 0x38, - 0xf9, 0x4d, 0x66, 0xd2, 0x13, 0xa7, 0x45, 0xf1, 0x30, 0x84, - 0xaf, 0x1b, 0xda, 0x6e, 0x06, 0xb2, 0x73, 0xc7, 0xec, 0x58, - 0x99, 0x2d, 0xcf, 0x7b, 0xba, 0x0e, 0x25, 0x91, 0x50, 0xe4, - 0x89, 0x3d, 0xfc, 0x48, 0x63, 0xd7, 0x16, 0xa2, 0x40, 0xf4, - 0x35, 0x81, 0xaa, 0x1e, 0xdf, 0x6b, 0x05, 0xb1, 0x70, 0xc4, - 0xef, 0x5b, 0x9a, 0x2e, 0xcc, 0x78, 0xb9, 0x0d, 0x26, 0x92, - 0x53, 0xe7, 0x8a, 0x3e, 0xff, 0x4b, 0x60, 0xd4, 0x15, 0xa1, - 0x43, 0xf7, 0x36, 0x82, 0xa9, 0x1d, 0xdc, 0x68, 0x0c, 0xb8, - 0x79, 0xcd, 0xe6, 0x52, 0x93, 0x27, 0xc5, 0x71, 0xb0, 0x04, - 0x2f, 0x9b, 0x5a, 0xee, 0x83, 0x37, 0xf6, 0x42, 0x69, 0xdd, - 0x1c, 0xa8, 0x4a, 0xfe, 0x3f, 0x8b, 0xa0, 0x14, 0xd5, 0x61, - 0x0f, 0xbb, 0x7a, 0xce, 0xe5, 0x51, 0x90, 0x24, 0xc6, 0x72, - 0xb3, 0x07, 0x2c, 0x98, 0x59, 0xed, 0x80, 0x34, 0xf5, 0x41, - 0x6a, 0xde, 0x1f, 0xab, 0x49, 0xfd, 0x3c, 0x88, 0xa3, 0x17, - 0xd6, 0x62, 0x0a, 0xbe, 0x7f, 0xcb, 0xe0, 0x54, 0x95, 0x21, - 0xc3, 0x77, 0xb6, 0x02, 0x29, 0x9d, 0x5c, 0xe8, 0x85, 0x31, - 0xf0, 0x44, 0x6f, 0xdb, 0x1a, 0xae, 0x4c, 0xf8, 0x39, 0x8d, - 0xa6, 0x12, 0xd3, 0x67, 0x09, 0xbd, 0x7c, 0xc8, 0xe3, 0x57, - 0x96, 0x22, 0xc0, 0x74, 0xb5, 0x01, 0x2a, 0x9e, 0x5f, 0xeb, - 0x86, 0x32, 0xf3, 0x47, 0x6c, 0xd8, 0x19, 0xad, 0x4f, 0xfb, - 0x3a, 0x8e, 0xa5, 0x11, 0xd0, 0x64, 0x00, 0xb5, 0x77, 0xc2, - 0xee, 0x5b, 0x99, 0x2c, 0xc1, 0x74, 0xb6, 0x03, 0x2f, 0x9a, - 0x58, 0xed, 0x9f, 0x2a, 0xe8, 0x5d, 0x71, 0xc4, 0x06, 0xb3, - 0x5e, 0xeb, 0x29, 0x9c, 0xb0, 0x05, 0xc7, 0x72, 0x23, 0x96, - 0x54, 0xe1, 0xcd, 0x78, 0xba, 0x0f, 0xe2, 0x57, 0x95, 0x20, - 0x0c, 0xb9, 0x7b, 0xce, 0xbc, 0x09, 0xcb, 0x7e, 0x52, 0xe7, - 0x25, 0x90, 0x7d, 0xc8, 0x0a, 0xbf, 0x93, 0x26, 0xe4, 0x51, - 0x46, 0xf3, 0x31, 0x84, 0xa8, 0x1d, 0xdf, 0x6a, 0x87, 0x32, - 0xf0, 0x45, 0x69, 0xdc, 0x1e, 0xab, 0xd9, 0x6c, 0xae, 0x1b, - 0x37, 0x82, 0x40, 0xf5, 0x18, 0xad, 0x6f, 0xda, 0xf6, 0x43, - 0x81, 0x34, 0x65, 0xd0, 0x12, 0xa7, 0x8b, 0x3e, 0xfc, 0x49, - 0xa4, 0x11, 0xd3, 0x66, 0x4a, 0xff, 0x3d, 0x88, 0xfa, 0x4f, - 0x8d, 0x38, 0x14, 0xa1, 0x63, 0xd6, 0x3b, 0x8e, 0x4c, 0xf9, - 0xd5, 0x60, 0xa2, 0x17, 0x8c, 0x39, 0xfb, 0x4e, 0x62, 0xd7, - 0x15, 0xa0, 0x4d, 0xf8, 0x3a, 0x8f, 0xa3, 0x16, 0xd4, 0x61, - 0x13, 0xa6, 0x64, 0xd1, 0xfd, 0x48, 0x8a, 0x3f, 0xd2, 0x67, - 0xa5, 0x10, 0x3c, 0x89, 0x4b, 0xfe, 0xaf, 0x1a, 0xd8, 0x6d, - 0x41, 0xf4, 0x36, 0x83, 0x6e, 0xdb, 0x19, 0xac, 0x80, 0x35, - 0xf7, 0x42, 0x30, 0x85, 0x47, 0xf2, 0xde, 0x6b, 0xa9, 0x1c, - 0xf1, 0x44, 0x86, 0x33, 0x1f, 0xaa, 0x68, 0xdd, 0xca, 0x7f, - 0xbd, 0x08, 0x24, 0x91, 0x53, 0xe6, 0x0b, 0xbe, 0x7c, 0xc9, - 0xe5, 0x50, 0x92, 0x27, 0x55, 0xe0, 0x22, 0x97, 0xbb, 0x0e, - 0xcc, 0x79, 0x94, 0x21, 0xe3, 0x56, 0x7a, 0xcf, 0x0d, 0xb8, - 0xe9, 0x5c, 0x9e, 0x2b, 0x07, 0xb2, 0x70, 0xc5, 0x28, 0x9d, - 0x5f, 0xea, 0xc6, 0x73, 0xb1, 0x04, 0x76, 0xc3, 0x01, 0xb4, - 0x98, 0x2d, 0xef, 0x5a, 0xb7, 0x02, 0xc0, 0x75, 0x59, 0xec, - 0x2e, 0x9b, 0x00, 0xb6, 0x71, 0xc7, 0xe2, 0x54, 0x93, 0x25, - 0xd9, 0x6f, 0xa8, 0x1e, 0x3b, 0x8d, 0x4a, 0xfc, 0xaf, 0x19, - 0xde, 0x68, 0x4d, 0xfb, 0x3c, 0x8a, 0x76, 0xc0, 0x07, 0xb1, - 0x94, 0x22, 0xe5, 0x53, 0x43, 0xf5, 0x32, 0x84, 0xa1, 0x17, - 0xd0, 0x66, 0x9a, 0x2c, 0xeb, 0x5d, 0x78, 0xce, 0x09, 0xbf, - 0xec, 0x5a, 0x9d, 0x2b, 0x0e, 0xb8, 0x7f, 0xc9, 0x35, 0x83, - 0x44, 0xf2, 0xd7, 0x61, 0xa6, 0x10, 0x86, 0x30, 0xf7, 0x41, - 0x64, 0xd2, 0x15, 0xa3, 0x5f, 0xe9, 0x2e, 0x98, 0xbd, 0x0b, - 0xcc, 0x7a, 0x29, 0x9f, 0x58, 0xee, 0xcb, 0x7d, 0xba, 0x0c, - 0xf0, 0x46, 0x81, 0x37, 0x12, 0xa4, 0x63, 0xd5, 0xc5, 0x73, - 0xb4, 0x02, 0x27, 0x91, 0x56, 0xe0, 0x1c, 0xaa, 0x6d, 0xdb, - 0xfe, 0x48, 0x8f, 0x39, 0x6a, 0xdc, 0x1b, 0xad, 0x88, 0x3e, - 0xf9, 0x4f, 0xb3, 0x05, 0xc2, 0x74, 0x51, 0xe7, 0x20, 0x96, - 0x11, 0xa7, 0x60, 0xd6, 0xf3, 0x45, 0x82, 0x34, 0xc8, 0x7e, - 0xb9, 0x0f, 0x2a, 0x9c, 0x5b, 0xed, 0xbe, 0x08, 0xcf, 0x79, - 0x5c, 0xea, 0x2d, 0x9b, 0x67, 0xd1, 0x16, 0xa0, 0x85, 0x33, - 0xf4, 0x42, 0x52, 0xe4, 0x23, 0x95, 0xb0, 0x06, 0xc1, 0x77, - 0x8b, 0x3d, 0xfa, 0x4c, 0x69, 0xdf, 0x18, 0xae, 0xfd, 0x4b, - 0x8c, 0x3a, 0x1f, 0xa9, 0x6e, 0xd8, 0x24, 0x92, 0x55, 0xe3, - 0xc6, 0x70, 0xb7, 0x01, 0x97, 0x21, 0xe6, 0x50, 0x75, 0xc3, - 0x04, 0xb2, 0x4e, 0xf8, 0x3f, 0x89, 0xac, 0x1a, 0xdd, 0x6b, - 0x38, 0x8e, 0x49, 0xff, 0xda, 0x6c, 0xab, 0x1d, 0xe1, 0x57, - 0x90, 0x26, 0x03, 0xb5, 0x72, 0xc4, 0xd4, 0x62, 0xa5, 0x13, - 0x36, 0x80, 0x47, 0xf1, 0x0d, 0xbb, 0x7c, 0xca, 0xef, 0x59, - 0x9e, 0x28, 0x7b, 0xcd, 0x0a, 0xbc, 0x99, 0x2f, 0xe8, 0x5e, - 0xa2, 0x14, 0xd3, 0x65, 0x40, 0xf6, 0x31, 0x87, 0x00, 0xb7, - 0x73, 0xc4, 0xe6, 0x51, 0x95, 0x22, 0xd1, 0x66, 0xa2, 0x15, - 0x37, 0x80, 0x44, 0xf3, 0xbf, 0x08, 0xcc, 0x7b, 0x59, 0xee, - 0x2a, 0x9d, 0x6e, 0xd9, 0x1d, 0xaa, 0x88, 0x3f, 0xfb, 0x4c, - 0x63, 0xd4, 0x10, 0xa7, 0x85, 0x32, 0xf6, 0x41, 0xb2, 0x05, - 0xc1, 0x76, 0x54, 0xe3, 0x27, 0x90, 0xdc, 0x6b, 0xaf, 0x18, - 0x3a, 0x8d, 0x49, 0xfe, 0x0d, 0xba, 0x7e, 0xc9, 0xeb, 0x5c, - 0x98, 0x2f, 0xc6, 0x71, 0xb5, 0x02, 0x20, 0x97, 0x53, 0xe4, - 0x17, 0xa0, 0x64, 0xd3, 0xf1, 0x46, 0x82, 0x35, 0x79, 0xce, - 0x0a, 0xbd, 0x9f, 0x28, 0xec, 0x5b, 0xa8, 0x1f, 0xdb, 0x6c, - 0x4e, 0xf9, 0x3d, 0x8a, 0xa5, 0x12, 0xd6, 0x61, 0x43, 0xf4, - 0x30, 0x87, 0x74, 0xc3, 0x07, 0xb0, 0x92, 0x25, 0xe1, 0x56, - 0x1a, 0xad, 0x69, 0xde, 0xfc, 0x4b, 0x8f, 0x38, 0xcb, 0x7c, - 0xb8, 0x0f, 0x2d, 0x9a, 0x5e, 0xe9, 0x91, 0x26, 0xe2, 0x55, - 0x77, 0xc0, 0x04, 0xb3, 0x40, 0xf7, 0x33, 0x84, 0xa6, 0x11, - 0xd5, 0x62, 0x2e, 0x99, 0x5d, 0xea, 0xc8, 0x7f, 0xbb, 0x0c, - 0xff, 0x48, 0x8c, 0x3b, 0x19, 0xae, 0x6a, 0xdd, 0xf2, 0x45, - 0x81, 0x36, 0x14, 0xa3, 0x67, 0xd0, 0x23, 0x94, 0x50, 0xe7, - 0xc5, 0x72, 0xb6, 0x01, 0x4d, 0xfa, 0x3e, 0x89, 0xab, 0x1c, - 0xd8, 0x6f, 0x9c, 0x2b, 0xef, 0x58, 0x7a, 0xcd, 0x09, 0xbe, - 0x57, 0xe0, 0x24, 0x93, 0xb1, 0x06, 0xc2, 0x75, 0x86, 0x31, - 0xf5, 0x42, 0x60, 0xd7, 0x13, 0xa4, 0xe8, 0x5f, 0x9b, 0x2c, - 0x0e, 0xb9, 0x7d, 0xca, 0x39, 0x8e, 0x4a, 0xfd, 0xdf, 0x68, - 0xac, 0x1b, 0x34, 0x83, 0x47, 0xf0, 0xd2, 0x65, 0xa1, 0x16, - 0xe5, 0x52, 0x96, 0x21, 0x03, 0xb4, 0x70, 0xc7, 0x8b, 0x3c, - 0xf8, 0x4f, 0x6d, 0xda, 0x1e, 0xa9, 0x5a, 0xed, 0x29, 0x9e, - 0xbc, 0x0b, 0xcf, 0x78, 0x00, 0xb8, 0x6d, 0xd5, 0xda, 0x62, - 0xb7, 0x0f, 0xa9, 0x11, 0xc4, 0x7c, 0x73, 0xcb, 0x1e, 0xa6, - 0x4f, 0xf7, 0x22, 0x9a, 0x95, 0x2d, 0xf8, 0x40, 0xe6, 0x5e, - 0x8b, 0x33, 0x3c, 0x84, 0x51, 0xe9, 0x9e, 0x26, 0xf3, 0x4b, - 0x44, 0xfc, 0x29, 0x91, 0x37, 0x8f, 0x5a, 0xe2, 0xed, 0x55, - 0x80, 0x38, 0xd1, 0x69, 0xbc, 0x04, 0x0b, 0xb3, 0x66, 0xde, - 0x78, 0xc0, 0x15, 0xad, 0xa2, 0x1a, 0xcf, 0x77, 0x21, 0x99, - 0x4c, 0xf4, 0xfb, 0x43, 0x96, 0x2e, 0x88, 0x30, 0xe5, 0x5d, - 0x52, 0xea, 0x3f, 0x87, 0x6e, 0xd6, 0x03, 0xbb, 0xb4, 0x0c, - 0xd9, 0x61, 0xc7, 0x7f, 0xaa, 0x12, 0x1d, 0xa5, 0x70, 0xc8, - 0xbf, 0x07, 0xd2, 0x6a, 0x65, 0xdd, 0x08, 0xb0, 0x16, 0xae, - 0x7b, 0xc3, 0xcc, 0x74, 0xa1, 0x19, 0xf0, 0x48, 0x9d, 0x25, - 0x2a, 0x92, 0x47, 0xff, 0x59, 0xe1, 0x34, 0x8c, 0x83, 0x3b, - 0xee, 0x56, 0x42, 0xfa, 0x2f, 0x97, 0x98, 0x20, 0xf5, 0x4d, - 0xeb, 0x53, 0x86, 0x3e, 0x31, 0x89, 0x5c, 0xe4, 0x0d, 0xb5, - 0x60, 0xd8, 0xd7, 0x6f, 0xba, 0x02, 0xa4, 0x1c, 0xc9, 0x71, - 0x7e, 0xc6, 0x13, 0xab, 0xdc, 0x64, 0xb1, 0x09, 0x06, 0xbe, - 0x6b, 0xd3, 0x75, 0xcd, 0x18, 0xa0, 0xaf, 0x17, 0xc2, 0x7a, - 0x93, 0x2b, 0xfe, 0x46, 0x49, 0xf1, 0x24, 0x9c, 0x3a, 0x82, - 0x57, 0xef, 0xe0, 0x58, 0x8d, 0x35, 0x63, 0xdb, 0x0e, 0xb6, - 0xb9, 0x01, 0xd4, 0x6c, 0xca, 0x72, 0xa7, 0x1f, 0x10, 0xa8, - 0x7d, 0xc5, 0x2c, 0x94, 0x41, 0xf9, 0xf6, 0x4e, 0x9b, 0x23, - 0x85, 0x3d, 0xe8, 0x50, 0x5f, 0xe7, 0x32, 0x8a, 0xfd, 0x45, - 0x90, 0x28, 0x27, 0x9f, 0x4a, 0xf2, 0x54, 0xec, 0x39, 0x81, - 0x8e, 0x36, 0xe3, 0x5b, 0xb2, 0x0a, 0xdf, 0x67, 0x68, 0xd0, - 0x05, 0xbd, 0x1b, 0xa3, 0x76, 0xce, 0xc1, 0x79, 0xac, 0x14, - 0x00, 0xb9, 0x6f, 0xd6, 0xde, 0x67, 0xb1, 0x08, 0xa1, 0x18, - 0xce, 0x77, 0x7f, 0xc6, 0x10, 0xa9, 0x5f, 0xe6, 0x30, 0x89, - 0x81, 0x38, 0xee, 0x57, 0xfe, 0x47, 0x91, 0x28, 0x20, 0x99, - 0x4f, 0xf6, 0xbe, 0x07, 0xd1, 0x68, 0x60, 0xd9, 0x0f, 0xb6, - 0x1f, 0xa6, 0x70, 0xc9, 0xc1, 0x78, 0xae, 0x17, 0xe1, 0x58, - 0x8e, 0x37, 0x3f, 0x86, 0x50, 0xe9, 0x40, 0xf9, 0x2f, 0x96, - 0x9e, 0x27, 0xf1, 0x48, 0x61, 0xd8, 0x0e, 0xb7, 0xbf, 0x06, - 0xd0, 0x69, 0xc0, 0x79, 0xaf, 0x16, 0x1e, 0xa7, 0x71, 0xc8, - 0x3e, 0x87, 0x51, 0xe8, 0xe0, 0x59, 0x8f, 0x36, 0x9f, 0x26, - 0xf0, 0x49, 0x41, 0xf8, 0x2e, 0x97, 0xdf, 0x66, 0xb0, 0x09, - 0x01, 0xb8, 0x6e, 0xd7, 0x7e, 0xc7, 0x11, 0xa8, 0xa0, 0x19, - 0xcf, 0x76, 0x80, 0x39, 0xef, 0x56, 0x5e, 0xe7, 0x31, 0x88, - 0x21, 0x98, 0x4e, 0xf7, 0xff, 0x46, 0x90, 0x29, 0xc2, 0x7b, - 0xad, 0x14, 0x1c, 0xa5, 0x73, 0xca, 0x63, 0xda, 0x0c, 0xb5, - 0xbd, 0x04, 0xd2, 0x6b, 0x9d, 0x24, 0xf2, 0x4b, 0x43, 0xfa, - 0x2c, 0x95, 0x3c, 0x85, 0x53, 0xea, 0xe2, 0x5b, 0x8d, 0x34, - 0x7c, 0xc5, 0x13, 0xaa, 0xa2, 0x1b, 0xcd, 0x74, 0xdd, 0x64, - 0xb2, 0x0b, 0x03, 0xba, 0x6c, 0xd5, 0x23, 0x9a, 0x4c, 0xf5, - 0xfd, 0x44, 0x92, 0x2b, 0x82, 0x3b, 0xed, 0x54, 0x5c, 0xe5, - 0x33, 0x8a, 0xa3, 0x1a, 0xcc, 0x75, 0x7d, 0xc4, 0x12, 0xab, - 0x02, 0xbb, 0x6d, 0xd4, 0xdc, 0x65, 0xb3, 0x0a, 0xfc, 0x45, - 0x93, 0x2a, 0x22, 0x9b, 0x4d, 0xf4, 0x5d, 0xe4, 0x32, 0x8b, - 0x83, 0x3a, 0xec, 0x55, 0x1d, 0xa4, 0x72, 0xcb, 0xc3, 0x7a, - 0xac, 0x15, 0xbc, 0x05, 0xd3, 0x6a, 0x62, 0xdb, 0x0d, 0xb4, - 0x42, 0xfb, 0x2d, 0x94, 0x9c, 0x25, 0xf3, 0x4a, 0xe3, 0x5a, - 0x8c, 0x35, 0x3d, 0x84, 0x52, 0xeb, 0x00, 0xba, 0x69, 0xd3, - 0xd2, 0x68, 0xbb, 0x01, 0xb9, 0x03, 0xd0, 0x6a, 0x6b, 0xd1, - 0x02, 0xb8, 0x6f, 0xd5, 0x06, 0xbc, 0xbd, 0x07, 0xd4, 0x6e, - 0xd6, 0x6c, 0xbf, 0x05, 0x04, 0xbe, 0x6d, 0xd7, 0xde, 0x64, - 0xb7, 0x0d, 0x0c, 0xb6, 0x65, 0xdf, 0x67, 0xdd, 0x0e, 0xb4, - 0xb5, 0x0f, 0xdc, 0x66, 0xb1, 0x0b, 0xd8, 0x62, 0x63, 0xd9, - 0x0a, 0xb0, 0x08, 0xb2, 0x61, 0xdb, 0xda, 0x60, 0xb3, 0x09, - 0xa1, 0x1b, 0xc8, 0x72, 0x73, 0xc9, 0x1a, 0xa0, 0x18, 0xa2, - 0x71, 0xcb, 0xca, 0x70, 0xa3, 0x19, 0xce, 0x74, 0xa7, 0x1d, - 0x1c, 0xa6, 0x75, 0xcf, 0x77, 0xcd, 0x1e, 0xa4, 0xa5, 0x1f, - 0xcc, 0x76, 0x7f, 0xc5, 0x16, 0xac, 0xad, 0x17, 0xc4, 0x7e, - 0xc6, 0x7c, 0xaf, 0x15, 0x14, 0xae, 0x7d, 0xc7, 0x10, 0xaa, - 0x79, 0xc3, 0xc2, 0x78, 0xab, 0x11, 0xa9, 0x13, 0xc0, 0x7a, - 0x7b, 0xc1, 0x12, 0xa8, 0x5f, 0xe5, 0x36, 0x8c, 0x8d, 0x37, - 0xe4, 0x5e, 0xe6, 0x5c, 0x8f, 0x35, 0x34, 0x8e, 0x5d, 0xe7, - 0x30, 0x8a, 0x59, 0xe3, 0xe2, 0x58, 0x8b, 0x31, 0x89, 0x33, - 0xe0, 0x5a, 0x5b, 0xe1, 0x32, 0x88, 0x81, 0x3b, 0xe8, 0x52, - 0x53, 0xe9, 0x3a, 0x80, 0x38, 0x82, 0x51, 0xeb, 0xea, 0x50, - 0x83, 0x39, 0xee, 0x54, 0x87, 0x3d, 0x3c, 0x86, 0x55, 0xef, - 0x57, 0xed, 0x3e, 0x84, 0x85, 0x3f, 0xec, 0x56, 0xfe, 0x44, - 0x97, 0x2d, 0x2c, 0x96, 0x45, 0xff, 0x47, 0xfd, 0x2e, 0x94, - 0x95, 0x2f, 0xfc, 0x46, 0x91, 0x2b, 0xf8, 0x42, 0x43, 0xf9, - 0x2a, 0x90, 0x28, 0x92, 0x41, 0xfb, 0xfa, 0x40, 0x93, 0x29, - 0x20, 0x9a, 0x49, 0xf3, 0xf2, 0x48, 0x9b, 0x21, 0x99, 0x23, - 0xf0, 0x4a, 0x4b, 0xf1, 0x22, 0x98, 0x4f, 0xf5, 0x26, 0x9c, - 0x9d, 0x27, 0xf4, 0x4e, 0xf6, 0x4c, 0x9f, 0x25, 0x24, 0x9e, - 0x4d, 0xf7, 0x00, 0xbb, 0x6b, 0xd0, 0xd6, 0x6d, 0xbd, 0x06, - 0xb1, 0x0a, 0xda, 0x61, 0x67, 0xdc, 0x0c, 0xb7, 0x7f, 0xc4, - 0x14, 0xaf, 0xa9, 0x12, 0xc2, 0x79, 0xce, 0x75, 0xa5, 0x1e, - 0x18, 0xa3, 0x73, 0xc8, 0xfe, 0x45, 0x95, 0x2e, 0x28, 0x93, - 0x43, 0xf8, 0x4f, 0xf4, 0x24, 0x9f, 0x99, 0x22, 0xf2, 0x49, - 0x81, 0x3a, 0xea, 0x51, 0x57, 0xec, 0x3c, 0x87, 0x30, 0x8b, - 0x5b, 0xe0, 0xe6, 0x5d, 0x8d, 0x36, 0xe1, 0x5a, 0x8a, 0x31, - 0x37, 0x8c, 0x5c, 0xe7, 0x50, 0xeb, 0x3b, 0x80, 0x86, 0x3d, - 0xed, 0x56, 0x9e, 0x25, 0xf5, 0x4e, 0x48, 0xf3, 0x23, 0x98, - 0x2f, 0x94, 0x44, 0xff, 0xf9, 0x42, 0x92, 0x29, 0x1f, 0xa4, - 0x74, 0xcf, 0xc9, 0x72, 0xa2, 0x19, 0xae, 0x15, 0xc5, 0x7e, - 0x78, 0xc3, 0x13, 0xa8, 0x60, 0xdb, 0x0b, 0xb0, 0xb6, 0x0d, - 0xdd, 0x66, 0xd1, 0x6a, 0xba, 0x01, 0x07, 0xbc, 0x6c, 0xd7, - 0xdf, 0x64, 0xb4, 0x0f, 0x09, 0xb2, 0x62, 0xd9, 0x6e, 0xd5, - 0x05, 0xbe, 0xb8, 0x03, 0xd3, 0x68, 0xa0, 0x1b, 0xcb, 0x70, - 0x76, 0xcd, 0x1d, 0xa6, 0x11, 0xaa, 0x7a, 0xc1, 0xc7, 0x7c, - 0xac, 0x17, 0x21, 0x9a, 0x4a, 0xf1, 0xf7, 0x4c, 0x9c, 0x27, - 0x90, 0x2b, 0xfb, 0x40, 0x46, 0xfd, 0x2d, 0x96, 0x5e, 0xe5, - 0x35, 0x8e, 0x88, 0x33, 0xe3, 0x58, 0xef, 0x54, 0x84, 0x3f, - 0x39, 0x82, 0x52, 0xe9, 0x3e, 0x85, 0x55, 0xee, 0xe8, 0x53, - 0x83, 0x38, 0x8f, 0x34, 0xe4, 0x5f, 0x59, 0xe2, 0x32, 0x89, - 0x41, 0xfa, 0x2a, 0x91, 0x97, 0x2c, 0xfc, 0x47, 0xf0, 0x4b, - 0x9b, 0x20, 0x26, 0x9d, 0x4d, 0xf6, 0xc0, 0x7b, 0xab, 0x10, - 0x16, 0xad, 0x7d, 0xc6, 0x71, 0xca, 0x1a, 0xa1, 0xa7, 0x1c, - 0xcc, 0x77, 0xbf, 0x04, 0xd4, 0x6f, 0x69, 0xd2, 0x02, 0xb9, - 0x0e, 0xb5, 0x65, 0xde, 0xd8, 0x63, 0xb3, 0x08, 0x00, 0xbc, - 0x65, 0xd9, 0xca, 0x76, 0xaf, 0x13, 0x89, 0x35, 0xec, 0x50, - 0x43, 0xff, 0x26, 0x9a, 0x0f, 0xb3, 0x6a, 0xd6, 0xc5, 0x79, - 0xa0, 0x1c, 0x86, 0x3a, 0xe3, 0x5f, 0x4c, 0xf0, 0x29, 0x95, - 0x1e, 0xa2, 0x7b, 0xc7, 0xd4, 0x68, 0xb1, 0x0d, 0x97, 0x2b, - 0xf2, 0x4e, 0x5d, 0xe1, 0x38, 0x84, 0x11, 0xad, 0x74, 0xc8, - 0xdb, 0x67, 0xbe, 0x02, 0x98, 0x24, 0xfd, 0x41, 0x52, 0xee, - 0x37, 0x8b, 0x3c, 0x80, 0x59, 0xe5, 0xf6, 0x4a, 0x93, 0x2f, - 0xb5, 0x09, 0xd0, 0x6c, 0x7f, 0xc3, 0x1a, 0xa6, 0x33, 0x8f, - 0x56, 0xea, 0xf9, 0x45, 0x9c, 0x20, 0xba, 0x06, 0xdf, 0x63, - 0x70, 0xcc, 0x15, 0xa9, 0x22, 0x9e, 0x47, 0xfb, 0xe8, 0x54, - 0x8d, 0x31, 0xab, 0x17, 0xce, 0x72, 0x61, 0xdd, 0x04, 0xb8, - 0x2d, 0x91, 0x48, 0xf4, 0xe7, 0x5b, 0x82, 0x3e, 0xa4, 0x18, - 0xc1, 0x7d, 0x6e, 0xd2, 0x0b, 0xb7, 0x78, 0xc4, 0x1d, 0xa1, - 0xb2, 0x0e, 0xd7, 0x6b, 0xf1, 0x4d, 0x94, 0x28, 0x3b, 0x87, - 0x5e, 0xe2, 0x77, 0xcb, 0x12, 0xae, 0xbd, 0x01, 0xd8, 0x64, - 0xfe, 0x42, 0x9b, 0x27, 0x34, 0x88, 0x51, 0xed, 0x66, 0xda, - 0x03, 0xbf, 0xac, 0x10, 0xc9, 0x75, 0xef, 0x53, 0x8a, 0x36, - 0x25, 0x99, 0x40, 0xfc, 0x69, 0xd5, 0x0c, 0xb0, 0xa3, 0x1f, - 0xc6, 0x7a, 0xe0, 0x5c, 0x85, 0x39, 0x2a, 0x96, 0x4f, 0xf3, - 0x44, 0xf8, 0x21, 0x9d, 0x8e, 0x32, 0xeb, 0x57, 0xcd, 0x71, - 0xa8, 0x14, 0x07, 0xbb, 0x62, 0xde, 0x4b, 0xf7, 0x2e, 0x92, - 0x81, 0x3d, 0xe4, 0x58, 0xc2, 0x7e, 0xa7, 0x1b, 0x08, 0xb4, - 0x6d, 0xd1, 0x5a, 0xe6, 0x3f, 0x83, 0x90, 0x2c, 0xf5, 0x49, - 0xd3, 0x6f, 0xb6, 0x0a, 0x19, 0xa5, 0x7c, 0xc0, 0x55, 0xe9, - 0x30, 0x8c, 0x9f, 0x23, 0xfa, 0x46, 0xdc, 0x60, 0xb9, 0x05, - 0x16, 0xaa, 0x73, 0xcf, 0x00, 0xbd, 0x67, 0xda, 0xce, 0x73, - 0xa9, 0x14, 0x81, 0x3c, 0xe6, 0x5b, 0x4f, 0xf2, 0x28, 0x95, - 0x1f, 0xa2, 0x78, 0xc5, 0xd1, 0x6c, 0xb6, 0x0b, 0x9e, 0x23, - 0xf9, 0x44, 0x50, 0xed, 0x37, 0x8a, 0x3e, 0x83, 0x59, 0xe4, - 0xf0, 0x4d, 0x97, 0x2a, 0xbf, 0x02, 0xd8, 0x65, 0x71, 0xcc, - 0x16, 0xab, 0x21, 0x9c, 0x46, 0xfb, 0xef, 0x52, 0x88, 0x35, - 0xa0, 0x1d, 0xc7, 0x7a, 0x6e, 0xd3, 0x09, 0xb4, 0x7c, 0xc1, - 0x1b, 0xa6, 0xb2, 0x0f, 0xd5, 0x68, 0xfd, 0x40, 0x9a, 0x27, - 0x33, 0x8e, 0x54, 0xe9, 0x63, 0xde, 0x04, 0xb9, 0xad, 0x10, - 0xca, 0x77, 0xe2, 0x5f, 0x85, 0x38, 0x2c, 0x91, 0x4b, 0xf6, - 0x42, 0xff, 0x25, 0x98, 0x8c, 0x31, 0xeb, 0x56, 0xc3, 0x7e, - 0xa4, 0x19, 0x0d, 0xb0, 0x6a, 0xd7, 0x5d, 0xe0, 0x3a, 0x87, - 0x93, 0x2e, 0xf4, 0x49, 0xdc, 0x61, 0xbb, 0x06, 0x12, 0xaf, - 0x75, 0xc8, 0xf8, 0x45, 0x9f, 0x22, 0x36, 0x8b, 0x51, 0xec, - 0x79, 0xc4, 0x1e, 0xa3, 0xb7, 0x0a, 0xd0, 0x6d, 0xe7, 0x5a, - 0x80, 0x3d, 0x29, 0x94, 0x4e, 0xf3, 0x66, 0xdb, 0x01, 0xbc, - 0xa8, 0x15, 0xcf, 0x72, 0xc6, 0x7b, 0xa1, 0x1c, 0x08, 0xb5, - 0x6f, 0xd2, 0x47, 0xfa, 0x20, 0x9d, 0x89, 0x34, 0xee, 0x53, - 0xd9, 0x64, 0xbe, 0x03, 0x17, 0xaa, 0x70, 0xcd, 0x58, 0xe5, - 0x3f, 0x82, 0x96, 0x2b, 0xf1, 0x4c, 0x84, 0x39, 0xe3, 0x5e, - 0x4a, 0xf7, 0x2d, 0x90, 0x05, 0xb8, 0x62, 0xdf, 0xcb, 0x76, - 0xac, 0x11, 0x9b, 0x26, 0xfc, 0x41, 0x55, 0xe8, 0x32, 0x8f, - 0x1a, 0xa7, 0x7d, 0xc0, 0xd4, 0x69, 0xb3, 0x0e, 0xba, 0x07, - 0xdd, 0x60, 0x74, 0xc9, 0x13, 0xae, 0x3b, 0x86, 0x5c, 0xe1, - 0xf5, 0x48, 0x92, 0x2f, 0xa5, 0x18, 0xc2, 0x7f, 0x6b, 0xd6, - 0x0c, 0xb1, 0x24, 0x99, 0x43, 0xfe, 0xea, 0x57, 0x8d, 0x30, - 0x00, 0xbe, 0x61, 0xdf, 0xc2, 0x7c, 0xa3, 0x1d, 0x99, 0x27, - 0xf8, 0x46, 0x5b, 0xe5, 0x3a, 0x84, 0x2f, 0x91, 0x4e, 0xf0, - 0xed, 0x53, 0x8c, 0x32, 0xb6, 0x08, 0xd7, 0x69, 0x74, 0xca, - 0x15, 0xab, 0x5e, 0xe0, 0x3f, 0x81, 0x9c, 0x22, 0xfd, 0x43, - 0xc7, 0x79, 0xa6, 0x18, 0x05, 0xbb, 0x64, 0xda, 0x71, 0xcf, - 0x10, 0xae, 0xb3, 0x0d, 0xd2, 0x6c, 0xe8, 0x56, 0x89, 0x37, - 0x2a, 0x94, 0x4b, 0xf5, 0xbc, 0x02, 0xdd, 0x63, 0x7e, 0xc0, - 0x1f, 0xa1, 0x25, 0x9b, 0x44, 0xfa, 0xe7, 0x59, 0x86, 0x38, - 0x93, 0x2d, 0xf2, 0x4c, 0x51, 0xef, 0x30, 0x8e, 0x0a, 0xb4, - 0x6b, 0xd5, 0xc8, 0x76, 0xa9, 0x17, 0xe2, 0x5c, 0x83, 0x3d, - 0x20, 0x9e, 0x41, 0xff, 0x7b, 0xc5, 0x1a, 0xa4, 0xb9, 0x07, - 0xd8, 0x66, 0xcd, 0x73, 0xac, 0x12, 0x0f, 0xb1, 0x6e, 0xd0, - 0x54, 0xea, 0x35, 0x8b, 0x96, 0x28, 0xf7, 0x49, 0x65, 0xdb, - 0x04, 0xba, 0xa7, 0x19, 0xc6, 0x78, 0xfc, 0x42, 0x9d, 0x23, - 0x3e, 0x80, 0x5f, 0xe1, 0x4a, 0xf4, 0x2b, 0x95, 0x88, 0x36, - 0xe9, 0x57, 0xd3, 0x6d, 0xb2, 0x0c, 0x11, 0xaf, 0x70, 0xce, - 0x3b, 0x85, 0x5a, 0xe4, 0xf9, 0x47, 0x98, 0x26, 0xa2, 0x1c, - 0xc3, 0x7d, 0x60, 0xde, 0x01, 0xbf, 0x14, 0xaa, 0x75, 0xcb, - 0xd6, 0x68, 0xb7, 0x09, 0x8d, 0x33, 0xec, 0x52, 0x4f, 0xf1, - 0x2e, 0x90, 0xd9, 0x67, 0xb8, 0x06, 0x1b, 0xa5, 0x7a, 0xc4, - 0x40, 0xfe, 0x21, 0x9f, 0x82, 0x3c, 0xe3, 0x5d, 0xf6, 0x48, - 0x97, 0x29, 0x34, 0x8a, 0x55, 0xeb, 0x6f, 0xd1, 0x0e, 0xb0, - 0xad, 0x13, 0xcc, 0x72, 0x87, 0x39, 0xe6, 0x58, 0x45, 0xfb, - 0x24, 0x9a, 0x1e, 0xa0, 0x7f, 0xc1, 0xdc, 0x62, 0xbd, 0x03, - 0xa8, 0x16, 0xc9, 0x77, 0x6a, 0xd4, 0x0b, 0xb5, 0x31, 0x8f, - 0x50, 0xee, 0xf3, 0x4d, 0x92, 0x2c, 0x00, 0xbf, 0x63, 0xdc, - 0xc6, 0x79, 0xa5, 0x1a, 0x91, 0x2e, 0xf2, 0x4d, 0x57, 0xe8, - 0x34, 0x8b, 0x3f, 0x80, 0x5c, 0xe3, 0xf9, 0x46, 0x9a, 0x25, - 0xae, 0x11, 0xcd, 0x72, 0x68, 0xd7, 0x0b, 0xb4, 0x7e, 0xc1, - 0x1d, 0xa2, 0xb8, 0x07, 0xdb, 0x64, 0xef, 0x50, 0x8c, 0x33, - 0x29, 0x96, 0x4a, 0xf5, 0x41, 0xfe, 0x22, 0x9d, 0x87, 0x38, - 0xe4, 0x5b, 0xd0, 0x6f, 0xb3, 0x0c, 0x16, 0xa9, 0x75, 0xca, - 0xfc, 0x43, 0x9f, 0x20, 0x3a, 0x85, 0x59, 0xe6, 0x6d, 0xd2, - 0x0e, 0xb1, 0xab, 0x14, 0xc8, 0x77, 0xc3, 0x7c, 0xa0, 0x1f, - 0x05, 0xba, 0x66, 0xd9, 0x52, 0xed, 0x31, 0x8e, 0x94, 0x2b, - 0xf7, 0x48, 0x82, 0x3d, 0xe1, 0x5e, 0x44, 0xfb, 0x27, 0x98, - 0x13, 0xac, 0x70, 0xcf, 0xd5, 0x6a, 0xb6, 0x09, 0xbd, 0x02, - 0xde, 0x61, 0x7b, 0xc4, 0x18, 0xa7, 0x2c, 0x93, 0x4f, 0xf0, - 0xea, 0x55, 0x89, 0x36, 0xe5, 0x5a, 0x86, 0x39, 0x23, 0x9c, - 0x40, 0xff, 0x74, 0xcb, 0x17, 0xa8, 0xb2, 0x0d, 0xd1, 0x6e, - 0xda, 0x65, 0xb9, 0x06, 0x1c, 0xa3, 0x7f, 0xc0, 0x4b, 0xf4, - 0x28, 0x97, 0x8d, 0x32, 0xee, 0x51, 0x9b, 0x24, 0xf8, 0x47, - 0x5d, 0xe2, 0x3e, 0x81, 0x0a, 0xb5, 0x69, 0xd6, 0xcc, 0x73, - 0xaf, 0x10, 0xa4, 0x1b, 0xc7, 0x78, 0x62, 0xdd, 0x01, 0xbe, - 0x35, 0x8a, 0x56, 0xe9, 0xf3, 0x4c, 0x90, 0x2f, 0x19, 0xa6, - 0x7a, 0xc5, 0xdf, 0x60, 0xbc, 0x03, 0x88, 0x37, 0xeb, 0x54, - 0x4e, 0xf1, 0x2d, 0x92, 0x26, 0x99, 0x45, 0xfa, 0xe0, 0x5f, - 0x83, 0x3c, 0xb7, 0x08, 0xd4, 0x6b, 0x71, 0xce, 0x12, 0xad, - 0x67, 0xd8, 0x04, 0xbb, 0xa1, 0x1e, 0xc2, 0x7d, 0xf6, 0x49, - 0x95, 0x2a, 0x30, 0x8f, 0x53, 0xec, 0x58, 0xe7, 0x3b, 0x84, - 0x9e, 0x21, 0xfd, 0x42, 0xc9, 0x76, 0xaa, 0x15, 0x0f, 0xb0, - 0x6c, 0xd3, 0x00, 0xc0, 0x9d, 0x5d, 0x27, 0xe7, 0xba, 0x7a, - 0x4e, 0x8e, 0xd3, 0x13, 0x69, 0xa9, 0xf4, 0x34, 0x9c, 0x5c, - 0x01, 0xc1, 0xbb, 0x7b, 0x26, 0xe6, 0xd2, 0x12, 0x4f, 0x8f, - 0xf5, 0x35, 0x68, 0xa8, 0x25, 0xe5, 0xb8, 0x78, 0x02, 0xc2, - 0x9f, 0x5f, 0x6b, 0xab, 0xf6, 0x36, 0x4c, 0x8c, 0xd1, 0x11, - 0xb9, 0x79, 0x24, 0xe4, 0x9e, 0x5e, 0x03, 0xc3, 0xf7, 0x37, - 0x6a, 0xaa, 0xd0, 0x10, 0x4d, 0x8d, 0x4a, 0x8a, 0xd7, 0x17, - 0x6d, 0xad, 0xf0, 0x30, 0x04, 0xc4, 0x99, 0x59, 0x23, 0xe3, - 0xbe, 0x7e, 0xd6, 0x16, 0x4b, 0x8b, 0xf1, 0x31, 0x6c, 0xac, - 0x98, 0x58, 0x05, 0xc5, 0xbf, 0x7f, 0x22, 0xe2, 0x6f, 0xaf, - 0xf2, 0x32, 0x48, 0x88, 0xd5, 0x15, 0x21, 0xe1, 0xbc, 0x7c, - 0x06, 0xc6, 0x9b, 0x5b, 0xf3, 0x33, 0x6e, 0xae, 0xd4, 0x14, - 0x49, 0x89, 0xbd, 0x7d, 0x20, 0xe0, 0x9a, 0x5a, 0x07, 0xc7, - 0x94, 0x54, 0x09, 0xc9, 0xb3, 0x73, 0x2e, 0xee, 0xda, 0x1a, - 0x47, 0x87, 0xfd, 0x3d, 0x60, 0xa0, 0x08, 0xc8, 0x95, 0x55, - 0x2f, 0xef, 0xb2, 0x72, 0x46, 0x86, 0xdb, 0x1b, 0x61, 0xa1, - 0xfc, 0x3c, 0xb1, 0x71, 0x2c, 0xec, 0x96, 0x56, 0x0b, 0xcb, - 0xff, 0x3f, 0x62, 0xa2, 0xd8, 0x18, 0x45, 0x85, 0x2d, 0xed, - 0xb0, 0x70, 0x0a, 0xca, 0x97, 0x57, 0x63, 0xa3, 0xfe, 0x3e, - 0x44, 0x84, 0xd9, 0x19, 0xde, 0x1e, 0x43, 0x83, 0xf9, 0x39, - 0x64, 0xa4, 0x90, 0x50, 0x0d, 0xcd, 0xb7, 0x77, 0x2a, 0xea, - 0x42, 0x82, 0xdf, 0x1f, 0x65, 0xa5, 0xf8, 0x38, 0x0c, 0xcc, - 0x91, 0x51, 0x2b, 0xeb, 0xb6, 0x76, 0xfb, 0x3b, 0x66, 0xa6, - 0xdc, 0x1c, 0x41, 0x81, 0xb5, 0x75, 0x28, 0xe8, 0x92, 0x52, - 0x0f, 0xcf, 0x67, 0xa7, 0xfa, 0x3a, 0x40, 0x80, 0xdd, 0x1d, - 0x29, 0xe9, 0xb4, 0x74, 0x0e, 0xce, 0x93, 0x53, 0x00, 0xc1, - 0x9f, 0x5e, 0x23, 0xe2, 0xbc, 0x7d, 0x46, 0x87, 0xd9, 0x18, - 0x65, 0xa4, 0xfa, 0x3b, 0x8c, 0x4d, 0x13, 0xd2, 0xaf, 0x6e, - 0x30, 0xf1, 0xca, 0x0b, 0x55, 0x94, 0xe9, 0x28, 0x76, 0xb7, - 0x05, 0xc4, 0x9a, 0x5b, 0x26, 0xe7, 0xb9, 0x78, 0x43, 0x82, - 0xdc, 0x1d, 0x60, 0xa1, 0xff, 0x3e, 0x89, 0x48, 0x16, 0xd7, - 0xaa, 0x6b, 0x35, 0xf4, 0xcf, 0x0e, 0x50, 0x91, 0xec, 0x2d, - 0x73, 0xb2, 0x0a, 0xcb, 0x95, 0x54, 0x29, 0xe8, 0xb6, 0x77, - 0x4c, 0x8d, 0xd3, 0x12, 0x6f, 0xae, 0xf0, 0x31, 0x86, 0x47, - 0x19, 0xd8, 0xa5, 0x64, 0x3a, 0xfb, 0xc0, 0x01, 0x5f, 0x9e, - 0xe3, 0x22, 0x7c, 0xbd, 0x0f, 0xce, 0x90, 0x51, 0x2c, 0xed, - 0xb3, 0x72, 0x49, 0x88, 0xd6, 0x17, 0x6a, 0xab, 0xf5, 0x34, - 0x83, 0x42, 0x1c, 0xdd, 0xa0, 0x61, 0x3f, 0xfe, 0xc5, 0x04, - 0x5a, 0x9b, 0xe6, 0x27, 0x79, 0xb8, 0x14, 0xd5, 0x8b, 0x4a, - 0x37, 0xf6, 0xa8, 0x69, 0x52, 0x93, 0xcd, 0x0c, 0x71, 0xb0, - 0xee, 0x2f, 0x98, 0x59, 0x07, 0xc6, 0xbb, 0x7a, 0x24, 0xe5, - 0xde, 0x1f, 0x41, 0x80, 0xfd, 0x3c, 0x62, 0xa3, 0x11, 0xd0, - 0x8e, 0x4f, 0x32, 0xf3, 0xad, 0x6c, 0x57, 0x96, 0xc8, 0x09, - 0x74, 0xb5, 0xeb, 0x2a, 0x9d, 0x5c, 0x02, 0xc3, 0xbe, 0x7f, - 0x21, 0xe0, 0xdb, 0x1a, 0x44, 0x85, 0xf8, 0x39, 0x67, 0xa6, - 0x1e, 0xdf, 0x81, 0x40, 0x3d, 0xfc, 0xa2, 0x63, 0x58, 0x99, - 0xc7, 0x06, 0x7b, 0xba, 0xe4, 0x25, 0x92, 0x53, 0x0d, 0xcc, - 0xb1, 0x70, 0x2e, 0xef, 0xd4, 0x15, 0x4b, 0x8a, 0xf7, 0x36, - 0x68, 0xa9, 0x1b, 0xda, 0x84, 0x45, 0x38, 0xf9, 0xa7, 0x66, - 0x5d, 0x9c, 0xc2, 0x03, 0x7e, 0xbf, 0xe1, 0x20, 0x97, 0x56, - 0x08, 0xc9, 0xb4, 0x75, 0x2b, 0xea, 0xd1, 0x10, 0x4e, 0x8f, - 0xf2, 0x33, 0x6d, 0xac, 0x00, 0xc2, 0x99, 0x5b, 0x2f, 0xed, - 0xb6, 0x74, 0x5e, 0x9c, 0xc7, 0x05, 0x71, 0xb3, 0xe8, 0x2a, - 0xbc, 0x7e, 0x25, 0xe7, 0x93, 0x51, 0x0a, 0xc8, 0xe2, 0x20, - 0x7b, 0xb9, 0xcd, 0x0f, 0x54, 0x96, 0x65, 0xa7, 0xfc, 0x3e, - 0x4a, 0x88, 0xd3, 0x11, 0x3b, 0xf9, 0xa2, 0x60, 0x14, 0xd6, - 0x8d, 0x4f, 0xd9, 0x1b, 0x40, 0x82, 0xf6, 0x34, 0x6f, 0xad, - 0x87, 0x45, 0x1e, 0xdc, 0xa8, 0x6a, 0x31, 0xf3, 0xca, 0x08, - 0x53, 0x91, 0xe5, 0x27, 0x7c, 0xbe, 0x94, 0x56, 0x0d, 0xcf, - 0xbb, 0x79, 0x22, 0xe0, 0x76, 0xb4, 0xef, 0x2d, 0x59, 0x9b, - 0xc0, 0x02, 0x28, 0xea, 0xb1, 0x73, 0x07, 0xc5, 0x9e, 0x5c, - 0xaf, 0x6d, 0x36, 0xf4, 0x80, 0x42, 0x19, 0xdb, 0xf1, 0x33, - 0x68, 0xaa, 0xde, 0x1c, 0x47, 0x85, 0x13, 0xd1, 0x8a, 0x48, - 0x3c, 0xfe, 0xa5, 0x67, 0x4d, 0x8f, 0xd4, 0x16, 0x62, 0xa0, - 0xfb, 0x39, 0x89, 0x4b, 0x10, 0xd2, 0xa6, 0x64, 0x3f, 0xfd, - 0xd7, 0x15, 0x4e, 0x8c, 0xf8, 0x3a, 0x61, 0xa3, 0x35, 0xf7, - 0xac, 0x6e, 0x1a, 0xd8, 0x83, 0x41, 0x6b, 0xa9, 0xf2, 0x30, - 0x44, 0x86, 0xdd, 0x1f, 0xec, 0x2e, 0x75, 0xb7, 0xc3, 0x01, - 0x5a, 0x98, 0xb2, 0x70, 0x2b, 0xe9, 0x9d, 0x5f, 0x04, 0xc6, - 0x50, 0x92, 0xc9, 0x0b, 0x7f, 0xbd, 0xe6, 0x24, 0x0e, 0xcc, - 0x97, 0x55, 0x21, 0xe3, 0xb8, 0x7a, 0x43, 0x81, 0xda, 0x18, - 0x6c, 0xae, 0xf5, 0x37, 0x1d, 0xdf, 0x84, 0x46, 0x32, 0xf0, - 0xab, 0x69, 0xff, 0x3d, 0x66, 0xa4, 0xd0, 0x12, 0x49, 0x8b, - 0xa1, 0x63, 0x38, 0xfa, 0x8e, 0x4c, 0x17, 0xd5, 0x26, 0xe4, - 0xbf, 0x7d, 0x09, 0xcb, 0x90, 0x52, 0x78, 0xba, 0xe1, 0x23, - 0x57, 0x95, 0xce, 0x0c, 0x9a, 0x58, 0x03, 0xc1, 0xb5, 0x77, - 0x2c, 0xee, 0xc4, 0x06, 0x5d, 0x9f, 0xeb, 0x29, 0x72, 0xb0, - 0x00, 0xc3, 0x9b, 0x58, 0x2b, 0xe8, 0xb0, 0x73, 0x56, 0x95, - 0xcd, 0x0e, 0x7d, 0xbe, 0xe6, 0x25, 0xac, 0x6f, 0x37, 0xf4, - 0x87, 0x44, 0x1c, 0xdf, 0xfa, 0x39, 0x61, 0xa2, 0xd1, 0x12, - 0x4a, 0x89, 0x45, 0x86, 0xde, 0x1d, 0x6e, 0xad, 0xf5, 0x36, - 0x13, 0xd0, 0x88, 0x4b, 0x38, 0xfb, 0xa3, 0x60, 0xe9, 0x2a, - 0x72, 0xb1, 0xc2, 0x01, 0x59, 0x9a, 0xbf, 0x7c, 0x24, 0xe7, - 0x94, 0x57, 0x0f, 0xcc, 0x8a, 0x49, 0x11, 0xd2, 0xa1, 0x62, - 0x3a, 0xf9, 0xdc, 0x1f, 0x47, 0x84, 0xf7, 0x34, 0x6c, 0xaf, - 0x26, 0xe5, 0xbd, 0x7e, 0x0d, 0xce, 0x96, 0x55, 0x70, 0xb3, - 0xeb, 0x28, 0x5b, 0x98, 0xc0, 0x03, 0xcf, 0x0c, 0x54, 0x97, - 0xe4, 0x27, 0x7f, 0xbc, 0x99, 0x5a, 0x02, 0xc1, 0xb2, 0x71, - 0x29, 0xea, 0x63, 0xa0, 0xf8, 0x3b, 0x48, 0x8b, 0xd3, 0x10, - 0x35, 0xf6, 0xae, 0x6d, 0x1e, 0xdd, 0x85, 0x46, 0x09, 0xca, - 0x92, 0x51, 0x22, 0xe1, 0xb9, 0x7a, 0x5f, 0x9c, 0xc4, 0x07, - 0x74, 0xb7, 0xef, 0x2c, 0xa5, 0x66, 0x3e, 0xfd, 0x8e, 0x4d, - 0x15, 0xd6, 0xf3, 0x30, 0x68, 0xab, 0xd8, 0x1b, 0x43, 0x80, - 0x4c, 0x8f, 0xd7, 0x14, 0x67, 0xa4, 0xfc, 0x3f, 0x1a, 0xd9, - 0x81, 0x42, 0x31, 0xf2, 0xaa, 0x69, 0xe0, 0x23, 0x7b, 0xb8, - 0xcb, 0x08, 0x50, 0x93, 0xb6, 0x75, 0x2d, 0xee, 0x9d, 0x5e, - 0x06, 0xc5, 0x83, 0x40, 0x18, 0xdb, 0xa8, 0x6b, 0x33, 0xf0, - 0xd5, 0x16, 0x4e, 0x8d, 0xfe, 0x3d, 0x65, 0xa6, 0x2f, 0xec, - 0xb4, 0x77, 0x04, 0xc7, 0x9f, 0x5c, 0x79, 0xba, 0xe2, 0x21, - 0x52, 0x91, 0xc9, 0x0a, 0xc6, 0x05, 0x5d, 0x9e, 0xed, 0x2e, - 0x76, 0xb5, 0x90, 0x53, 0x0b, 0xc8, 0xbb, 0x78, 0x20, 0xe3, - 0x6a, 0xa9, 0xf1, 0x32, 0x41, 0x82, 0xda, 0x19, 0x3c, 0xff, - 0xa7, 0x64, 0x17, 0xd4, 0x8c, 0x4f, 0x00, 0xc4, 0x95, 0x51, - 0x37, 0xf3, 0xa2, 0x66, 0x6e, 0xaa, 0xfb, 0x3f, 0x59, 0x9d, - 0xcc, 0x08, 0xdc, 0x18, 0x49, 0x8d, 0xeb, 0x2f, 0x7e, 0xba, - 0xb2, 0x76, 0x27, 0xe3, 0x85, 0x41, 0x10, 0xd4, 0xa5, 0x61, - 0x30, 0xf4, 0x92, 0x56, 0x07, 0xc3, 0xcb, 0x0f, 0x5e, 0x9a, - 0xfc, 0x38, 0x69, 0xad, 0x79, 0xbd, 0xec, 0x28, 0x4e, 0x8a, - 0xdb, 0x1f, 0x17, 0xd3, 0x82, 0x46, 0x20, 0xe4, 0xb5, 0x71, - 0x57, 0x93, 0xc2, 0x06, 0x60, 0xa4, 0xf5, 0x31, 0x39, 0xfd, - 0xac, 0x68, 0x0e, 0xca, 0x9b, 0x5f, 0x8b, 0x4f, 0x1e, 0xda, - 0xbc, 0x78, 0x29, 0xed, 0xe5, 0x21, 0x70, 0xb4, 0xd2, 0x16, - 0x47, 0x83, 0xf2, 0x36, 0x67, 0xa3, 0xc5, 0x01, 0x50, 0x94, - 0x9c, 0x58, 0x09, 0xcd, 0xab, 0x6f, 0x3e, 0xfa, 0x2e, 0xea, - 0xbb, 0x7f, 0x19, 0xdd, 0x8c, 0x48, 0x40, 0x84, 0xd5, 0x11, - 0x77, 0xb3, 0xe2, 0x26, 0xae, 0x6a, 0x3b, 0xff, 0x99, 0x5d, - 0x0c, 0xc8, 0xc0, 0x04, 0x55, 0x91, 0xf7, 0x33, 0x62, 0xa6, - 0x72, 0xb6, 0xe7, 0x23, 0x45, 0x81, 0xd0, 0x14, 0x1c, 0xd8, - 0x89, 0x4d, 0x2b, 0xef, 0xbe, 0x7a, 0x0b, 0xcf, 0x9e, 0x5a, - 0x3c, 0xf8, 0xa9, 0x6d, 0x65, 0xa1, 0xf0, 0x34, 0x52, 0x96, - 0xc7, 0x03, 0xd7, 0x13, 0x42, 0x86, 0xe0, 0x24, 0x75, 0xb1, - 0xb9, 0x7d, 0x2c, 0xe8, 0x8e, 0x4a, 0x1b, 0xdf, 0xf9, 0x3d, - 0x6c, 0xa8, 0xce, 0x0a, 0x5b, 0x9f, 0x97, 0x53, 0x02, 0xc6, - 0xa0, 0x64, 0x35, 0xf1, 0x25, 0xe1, 0xb0, 0x74, 0x12, 0xd6, - 0x87, 0x43, 0x4b, 0x8f, 0xde, 0x1a, 0x7c, 0xb8, 0xe9, 0x2d, - 0x5c, 0x98, 0xc9, 0x0d, 0x6b, 0xaf, 0xfe, 0x3a, 0x32, 0xf6, - 0xa7, 0x63, 0x05, 0xc1, 0x90, 0x54, 0x80, 0x44, 0x15, 0xd1, - 0xb7, 0x73, 0x22, 0xe6, 0xee, 0x2a, 0x7b, 0xbf, 0xd9, 0x1d, - 0x4c, 0x88, 0x00, 0xc5, 0x97, 0x52, 0x33, 0xf6, 0xa4, 0x61, - 0x66, 0xa3, 0xf1, 0x34, 0x55, 0x90, 0xc2, 0x07, 0xcc, 0x09, - 0x5b, 0x9e, 0xff, 0x3a, 0x68, 0xad, 0xaa, 0x6f, 0x3d, 0xf8, - 0x99, 0x5c, 0x0e, 0xcb, 0x85, 0x40, 0x12, 0xd7, 0xb6, 0x73, - 0x21, 0xe4, 0xe3, 0x26, 0x74, 0xb1, 0xd0, 0x15, 0x47, 0x82, - 0x49, 0x8c, 0xde, 0x1b, 0x7a, 0xbf, 0xed, 0x28, 0x2f, 0xea, - 0xb8, 0x7d, 0x1c, 0xd9, 0x8b, 0x4e, 0x17, 0xd2, 0x80, 0x45, - 0x24, 0xe1, 0xb3, 0x76, 0x71, 0xb4, 0xe6, 0x23, 0x42, 0x87, - 0xd5, 0x10, 0xdb, 0x1e, 0x4c, 0x89, 0xe8, 0x2d, 0x7f, 0xba, - 0xbd, 0x78, 0x2a, 0xef, 0x8e, 0x4b, 0x19, 0xdc, 0x92, 0x57, - 0x05, 0xc0, 0xa1, 0x64, 0x36, 0xf3, 0xf4, 0x31, 0x63, 0xa6, - 0xc7, 0x02, 0x50, 0x95, 0x5e, 0x9b, 0xc9, 0x0c, 0x6d, 0xa8, - 0xfa, 0x3f, 0x38, 0xfd, 0xaf, 0x6a, 0x0b, 0xce, 0x9c, 0x59, - 0x2e, 0xeb, 0xb9, 0x7c, 0x1d, 0xd8, 0x8a, 0x4f, 0x48, 0x8d, - 0xdf, 0x1a, 0x7b, 0xbe, 0xec, 0x29, 0xe2, 0x27, 0x75, 0xb0, - 0xd1, 0x14, 0x46, 0x83, 0x84, 0x41, 0x13, 0xd6, 0xb7, 0x72, - 0x20, 0xe5, 0xab, 0x6e, 0x3c, 0xf9, 0x98, 0x5d, 0x0f, 0xca, - 0xcd, 0x08, 0x5a, 0x9f, 0xfe, 0x3b, 0x69, 0xac, 0x67, 0xa2, - 0xf0, 0x35, 0x54, 0x91, 0xc3, 0x06, 0x01, 0xc4, 0x96, 0x53, - 0x32, 0xf7, 0xa5, 0x60, 0x39, 0xfc, 0xae, 0x6b, 0x0a, 0xcf, - 0x9d, 0x58, 0x5f, 0x9a, 0xc8, 0x0d, 0x6c, 0xa9, 0xfb, 0x3e, - 0xf5, 0x30, 0x62, 0xa7, 0xc6, 0x03, 0x51, 0x94, 0x93, 0x56, - 0x04, 0xc1, 0xa0, 0x65, 0x37, 0xf2, 0xbc, 0x79, 0x2b, 0xee, - 0x8f, 0x4a, 0x18, 0xdd, 0xda, 0x1f, 0x4d, 0x88, 0xe9, 0x2c, - 0x7e, 0xbb, 0x70, 0xb5, 0xe7, 0x22, 0x43, 0x86, 0xd4, 0x11, - 0x16, 0xd3, 0x81, 0x44, 0x25, 0xe0, 0xb2, 0x77, 0x00, 0xc6, - 0x91, 0x57, 0x3f, 0xf9, 0xae, 0x68, 0x7e, 0xb8, 0xef, 0x29, - 0x41, 0x87, 0xd0, 0x16, 0xfc, 0x3a, 0x6d, 0xab, 0xc3, 0x05, - 0x52, 0x94, 0x82, 0x44, 0x13, 0xd5, 0xbd, 0x7b, 0x2c, 0xea, - 0xe5, 0x23, 0x74, 0xb2, 0xda, 0x1c, 0x4b, 0x8d, 0x9b, 0x5d, - 0x0a, 0xcc, 0xa4, 0x62, 0x35, 0xf3, 0x19, 0xdf, 0x88, 0x4e, - 0x26, 0xe0, 0xb7, 0x71, 0x67, 0xa1, 0xf6, 0x30, 0x58, 0x9e, - 0xc9, 0x0f, 0xd7, 0x11, 0x46, 0x80, 0xe8, 0x2e, 0x79, 0xbf, - 0xa9, 0x6f, 0x38, 0xfe, 0x96, 0x50, 0x07, 0xc1, 0x2b, 0xed, - 0xba, 0x7c, 0x14, 0xd2, 0x85, 0x43, 0x55, 0x93, 0xc4, 0x02, - 0x6a, 0xac, 0xfb, 0x3d, 0x32, 0xf4, 0xa3, 0x65, 0x0d, 0xcb, - 0x9c, 0x5a, 0x4c, 0x8a, 0xdd, 0x1b, 0x73, 0xb5, 0xe2, 0x24, - 0xce, 0x08, 0x5f, 0x99, 0xf1, 0x37, 0x60, 0xa6, 0xb0, 0x76, - 0x21, 0xe7, 0x8f, 0x49, 0x1e, 0xd8, 0xb3, 0x75, 0x22, 0xe4, - 0x8c, 0x4a, 0x1d, 0xdb, 0xcd, 0x0b, 0x5c, 0x9a, 0xf2, 0x34, - 0x63, 0xa5, 0x4f, 0x89, 0xde, 0x18, 0x70, 0xb6, 0xe1, 0x27, - 0x31, 0xf7, 0xa0, 0x66, 0x0e, 0xc8, 0x9f, 0x59, 0x56, 0x90, - 0xc7, 0x01, 0x69, 0xaf, 0xf8, 0x3e, 0x28, 0xee, 0xb9, 0x7f, - 0x17, 0xd1, 0x86, 0x40, 0xaa, 0x6c, 0x3b, 0xfd, 0x95, 0x53, - 0x04, 0xc2, 0xd4, 0x12, 0x45, 0x83, 0xeb, 0x2d, 0x7a, 0xbc, - 0x64, 0xa2, 0xf5, 0x33, 0x5b, 0x9d, 0xca, 0x0c, 0x1a, 0xdc, - 0x8b, 0x4d, 0x25, 0xe3, 0xb4, 0x72, 0x98, 0x5e, 0x09, 0xcf, - 0xa7, 0x61, 0x36, 0xf0, 0xe6, 0x20, 0x77, 0xb1, 0xd9, 0x1f, - 0x48, 0x8e, 0x81, 0x47, 0x10, 0xd6, 0xbe, 0x78, 0x2f, 0xe9, - 0xff, 0x39, 0x6e, 0xa8, 0xc0, 0x06, 0x51, 0x97, 0x7d, 0xbb, - 0xec, 0x2a, 0x42, 0x84, 0xd3, 0x15, 0x03, 0xc5, 0x92, 0x54, - 0x3c, 0xfa, 0xad, 0x6b, 0x00, 0xc7, 0x93, 0x54, 0x3b, 0xfc, - 0xa8, 0x6f, 0x76, 0xb1, 0xe5, 0x22, 0x4d, 0x8a, 0xde, 0x19, - 0xec, 0x2b, 0x7f, 0xb8, 0xd7, 0x10, 0x44, 0x83, 0x9a, 0x5d, - 0x09, 0xce, 0xa1, 0x66, 0x32, 0xf5, 0xc5, 0x02, 0x56, 0x91, - 0xfe, 0x39, 0x6d, 0xaa, 0xb3, 0x74, 0x20, 0xe7, 0x88, 0x4f, - 0x1b, 0xdc, 0x29, 0xee, 0xba, 0x7d, 0x12, 0xd5, 0x81, 0x46, - 0x5f, 0x98, 0xcc, 0x0b, 0x64, 0xa3, 0xf7, 0x30, 0x97, 0x50, - 0x04, 0xc3, 0xac, 0x6b, 0x3f, 0xf8, 0xe1, 0x26, 0x72, 0xb5, - 0xda, 0x1d, 0x49, 0x8e, 0x7b, 0xbc, 0xe8, 0x2f, 0x40, 0x87, - 0xd3, 0x14, 0x0d, 0xca, 0x9e, 0x59, 0x36, 0xf1, 0xa5, 0x62, - 0x52, 0x95, 0xc1, 0x06, 0x69, 0xae, 0xfa, 0x3d, 0x24, 0xe3, - 0xb7, 0x70, 0x1f, 0xd8, 0x8c, 0x4b, 0xbe, 0x79, 0x2d, 0xea, - 0x85, 0x42, 0x16, 0xd1, 0xc8, 0x0f, 0x5b, 0x9c, 0xf3, 0x34, - 0x60, 0xa7, 0x33, 0xf4, 0xa0, 0x67, 0x08, 0xcf, 0x9b, 0x5c, - 0x45, 0x82, 0xd6, 0x11, 0x7e, 0xb9, 0xed, 0x2a, 0xdf, 0x18, - 0x4c, 0x8b, 0xe4, 0x23, 0x77, 0xb0, 0xa9, 0x6e, 0x3a, 0xfd, - 0x92, 0x55, 0x01, 0xc6, 0xf6, 0x31, 0x65, 0xa2, 0xcd, 0x0a, - 0x5e, 0x99, 0x80, 0x47, 0x13, 0xd4, 0xbb, 0x7c, 0x28, 0xef, - 0x1a, 0xdd, 0x89, 0x4e, 0x21, 0xe6, 0xb2, 0x75, 0x6c, 0xab, - 0xff, 0x38, 0x57, 0x90, 0xc4, 0x03, 0xa4, 0x63, 0x37, 0xf0, - 0x9f, 0x58, 0x0c, 0xcb, 0xd2, 0x15, 0x41, 0x86, 0xe9, 0x2e, - 0x7a, 0xbd, 0x48, 0x8f, 0xdb, 0x1c, 0x73, 0xb4, 0xe0, 0x27, - 0x3e, 0xf9, 0xad, 0x6a, 0x05, 0xc2, 0x96, 0x51, 0x61, 0xa6, - 0xf2, 0x35, 0x5a, 0x9d, 0xc9, 0x0e, 0x17, 0xd0, 0x84, 0x43, - 0x2c, 0xeb, 0xbf, 0x78, 0x8d, 0x4a, 0x1e, 0xd9, 0xb6, 0x71, - 0x25, 0xe2, 0xfb, 0x3c, 0x68, 0xaf, 0xc0, 0x07, 0x53, 0x94, - 0x00, 0xc8, 0x8d, 0x45, 0x07, 0xcf, 0x8a, 0x42, 0x0e, 0xc6, - 0x83, 0x4b, 0x09, 0xc1, 0x84, 0x4c, 0x1c, 0xd4, 0x91, 0x59, - 0x1b, 0xd3, 0x96, 0x5e, 0x12, 0xda, 0x9f, 0x57, 0x15, 0xdd, - 0x98, 0x50, 0x38, 0xf0, 0xb5, 0x7d, 0x3f, 0xf7, 0xb2, 0x7a, - 0x36, 0xfe, 0xbb, 0x73, 0x31, 0xf9, 0xbc, 0x74, 0x24, 0xec, - 0xa9, 0x61, 0x23, 0xeb, 0xae, 0x66, 0x2a, 0xe2, 0xa7, 0x6f, - 0x2d, 0xe5, 0xa0, 0x68, 0x70, 0xb8, 0xfd, 0x35, 0x77, 0xbf, - 0xfa, 0x32, 0x7e, 0xb6, 0xf3, 0x3b, 0x79, 0xb1, 0xf4, 0x3c, - 0x6c, 0xa4, 0xe1, 0x29, 0x6b, 0xa3, 0xe6, 0x2e, 0x62, 0xaa, - 0xef, 0x27, 0x65, 0xad, 0xe8, 0x20, 0x48, 0x80, 0xc5, 0x0d, - 0x4f, 0x87, 0xc2, 0x0a, 0x46, 0x8e, 0xcb, 0x03, 0x41, 0x89, - 0xcc, 0x04, 0x54, 0x9c, 0xd9, 0x11, 0x53, 0x9b, 0xde, 0x16, - 0x5a, 0x92, 0xd7, 0x1f, 0x5d, 0x95, 0xd0, 0x18, 0xe0, 0x28, - 0x6d, 0xa5, 0xe7, 0x2f, 0x6a, 0xa2, 0xee, 0x26, 0x63, 0xab, - 0xe9, 0x21, 0x64, 0xac, 0xfc, 0x34, 0x71, 0xb9, 0xfb, 0x33, - 0x76, 0xbe, 0xf2, 0x3a, 0x7f, 0xb7, 0xf5, 0x3d, 0x78, 0xb0, - 0xd8, 0x10, 0x55, 0x9d, 0xdf, 0x17, 0x52, 0x9a, 0xd6, 0x1e, - 0x5b, 0x93, 0xd1, 0x19, 0x5c, 0x94, 0xc4, 0x0c, 0x49, 0x81, - 0xc3, 0x0b, 0x4e, 0x86, 0xca, 0x02, 0x47, 0x8f, 0xcd, 0x05, - 0x40, 0x88, 0x90, 0x58, 0x1d, 0xd5, 0x97, 0x5f, 0x1a, 0xd2, - 0x9e, 0x56, 0x13, 0xdb, 0x99, 0x51, 0x14, 0xdc, 0x8c, 0x44, - 0x01, 0xc9, 0x8b, 0x43, 0x06, 0xce, 0x82, 0x4a, 0x0f, 0xc7, - 0x85, 0x4d, 0x08, 0xc0, 0xa8, 0x60, 0x25, 0xed, 0xaf, 0x67, - 0x22, 0xea, 0xa6, 0x6e, 0x2b, 0xe3, 0xa1, 0x69, 0x2c, 0xe4, - 0xb4, 0x7c, 0x39, 0xf1, 0xb3, 0x7b, 0x3e, 0xf6, 0xba, 0x72, - 0x37, 0xff, 0xbd, 0x75, 0x30, 0xf8, 0x00, 0xc9, 0x8f, 0x46, - 0x03, 0xca, 0x8c, 0x45, 0x06, 0xcf, 0x89, 0x40, 0x05, 0xcc, - 0x8a, 0x43, 0x0c, 0xc5, 0x83, 0x4a, 0x0f, 0xc6, 0x80, 0x49, - 0x0a, 0xc3, 0x85, 0x4c, 0x09, 0xc0, 0x86, 0x4f, 0x18, 0xd1, - 0x97, 0x5e, 0x1b, 0xd2, 0x94, 0x5d, 0x1e, 0xd7, 0x91, 0x58, - 0x1d, 0xd4, 0x92, 0x5b, 0x14, 0xdd, 0x9b, 0x52, 0x17, 0xde, - 0x98, 0x51, 0x12, 0xdb, 0x9d, 0x54, 0x11, 0xd8, 0x9e, 0x57, - 0x30, 0xf9, 0xbf, 0x76, 0x33, 0xfa, 0xbc, 0x75, 0x36, 0xff, - 0xb9, 0x70, 0x35, 0xfc, 0xba, 0x73, 0x3c, 0xf5, 0xb3, 0x7a, - 0x3f, 0xf6, 0xb0, 0x79, 0x3a, 0xf3, 0xb5, 0x7c, 0x39, 0xf0, - 0xb6, 0x7f, 0x28, 0xe1, 0xa7, 0x6e, 0x2b, 0xe2, 0xa4, 0x6d, - 0x2e, 0xe7, 0xa1, 0x68, 0x2d, 0xe4, 0xa2, 0x6b, 0x24, 0xed, - 0xab, 0x62, 0x27, 0xee, 0xa8, 0x61, 0x22, 0xeb, 0xad, 0x64, - 0x21, 0xe8, 0xae, 0x67, 0x60, 0xa9, 0xef, 0x26, 0x63, 0xaa, - 0xec, 0x25, 0x66, 0xaf, 0xe9, 0x20, 0x65, 0xac, 0xea, 0x23, - 0x6c, 0xa5, 0xe3, 0x2a, 0x6f, 0xa6, 0xe0, 0x29, 0x6a, 0xa3, - 0xe5, 0x2c, 0x69, 0xa0, 0xe6, 0x2f, 0x78, 0xb1, 0xf7, 0x3e, - 0x7b, 0xb2, 0xf4, 0x3d, 0x7e, 0xb7, 0xf1, 0x38, 0x7d, 0xb4, - 0xf2, 0x3b, 0x74, 0xbd, 0xfb, 0x32, 0x77, 0xbe, 0xf8, 0x31, - 0x72, 0xbb, 0xfd, 0x34, 0x71, 0xb8, 0xfe, 0x37, 0x50, 0x99, - 0xdf, 0x16, 0x53, 0x9a, 0xdc, 0x15, 0x56, 0x9f, 0xd9, 0x10, - 0x55, 0x9c, 0xda, 0x13, 0x5c, 0x95, 0xd3, 0x1a, 0x5f, 0x96, - 0xd0, 0x19, 0x5a, 0x93, 0xd5, 0x1c, 0x59, 0x90, 0xd6, 0x1f, - 0x48, 0x81, 0xc7, 0x0e, 0x4b, 0x82, 0xc4, 0x0d, 0x4e, 0x87, - 0xc1, 0x08, 0x4d, 0x84, 0xc2, 0x0b, 0x44, 0x8d, 0xcb, 0x02, - 0x47, 0x8e, 0xc8, 0x01, 0x42, 0x8b, 0xcd, 0x04, 0x41, 0x88, - 0xce, 0x07, 0x00, 0xca, 0x89, 0x43, 0x0f, 0xc5, 0x86, 0x4c, - 0x1e, 0xd4, 0x97, 0x5d, 0x11, 0xdb, 0x98, 0x52, 0x3c, 0xf6, - 0xb5, 0x7f, 0x33, 0xf9, 0xba, 0x70, 0x22, 0xe8, 0xab, 0x61, - 0x2d, 0xe7, 0xa4, 0x6e, 0x78, 0xb2, 0xf1, 0x3b, 0x77, 0xbd, - 0xfe, 0x34, 0x66, 0xac, 0xef, 0x25, 0x69, 0xa3, 0xe0, 0x2a, - 0x44, 0x8e, 0xcd, 0x07, 0x4b, 0x81, 0xc2, 0x08, 0x5a, 0x90, - 0xd3, 0x19, 0x55, 0x9f, 0xdc, 0x16, 0xf0, 0x3a, 0x79, 0xb3, - 0xff, 0x35, 0x76, 0xbc, 0xee, 0x24, 0x67, 0xad, 0xe1, 0x2b, - 0x68, 0xa2, 0xcc, 0x06, 0x45, 0x8f, 0xc3, 0x09, 0x4a, 0x80, - 0xd2, 0x18, 0x5b, 0x91, 0xdd, 0x17, 0x54, 0x9e, 0x88, 0x42, - 0x01, 0xcb, 0x87, 0x4d, 0x0e, 0xc4, 0x96, 0x5c, 0x1f, 0xd5, - 0x99, 0x53, 0x10, 0xda, 0xb4, 0x7e, 0x3d, 0xf7, 0xbb, 0x71, - 0x32, 0xf8, 0xaa, 0x60, 0x23, 0xe9, 0xa5, 0x6f, 0x2c, 0xe6, - 0xfd, 0x37, 0x74, 0xbe, 0xf2, 0x38, 0x7b, 0xb1, 0xe3, 0x29, - 0x6a, 0xa0, 0xec, 0x26, 0x65, 0xaf, 0xc1, 0x0b, 0x48, 0x82, - 0xce, 0x04, 0x47, 0x8d, 0xdf, 0x15, 0x56, 0x9c, 0xd0, 0x1a, - 0x59, 0x93, 0x85, 0x4f, 0x0c, 0xc6, 0x8a, 0x40, 0x03, 0xc9, - 0x9b, 0x51, 0x12, 0xd8, 0x94, 0x5e, 0x1d, 0xd7, 0xb9, 0x73, - 0x30, 0xfa, 0xb6, 0x7c, 0x3f, 0xf5, 0xa7, 0x6d, 0x2e, 0xe4, - 0xa8, 0x62, 0x21, 0xeb, 0x0d, 0xc7, 0x84, 0x4e, 0x02, 0xc8, - 0x8b, 0x41, 0x13, 0xd9, 0x9a, 0x50, 0x1c, 0xd6, 0x95, 0x5f, - 0x31, 0xfb, 0xb8, 0x72, 0x3e, 0xf4, 0xb7, 0x7d, 0x2f, 0xe5, - 0xa6, 0x6c, 0x20, 0xea, 0xa9, 0x63, 0x75, 0xbf, 0xfc, 0x36, - 0x7a, 0xb0, 0xf3, 0x39, 0x6b, 0xa1, 0xe2, 0x28, 0x64, 0xae, - 0xed, 0x27, 0x49, 0x83, 0xc0, 0x0a, 0x46, 0x8c, 0xcf, 0x05, - 0x57, 0x9d, 0xde, 0x14, 0x58, 0x92, 0xd1, 0x1b, 0x00, 0xcb, - 0x8b, 0x40, 0x0b, 0xc0, 0x80, 0x4b, 0x16, 0xdd, 0x9d, 0x56, - 0x1d, 0xd6, 0x96, 0x5d, 0x2c, 0xe7, 0xa7, 0x6c, 0x27, 0xec, - 0xac, 0x67, 0x3a, 0xf1, 0xb1, 0x7a, 0x31, 0xfa, 0xba, 0x71, - 0x58, 0x93, 0xd3, 0x18, 0x53, 0x98, 0xd8, 0x13, 0x4e, 0x85, - 0xc5, 0x0e, 0x45, 0x8e, 0xce, 0x05, 0x74, 0xbf, 0xff, 0x34, - 0x7f, 0xb4, 0xf4, 0x3f, 0x62, 0xa9, 0xe9, 0x22, 0x69, 0xa2, - 0xe2, 0x29, 0xb0, 0x7b, 0x3b, 0xf0, 0xbb, 0x70, 0x30, 0xfb, - 0xa6, 0x6d, 0x2d, 0xe6, 0xad, 0x66, 0x26, 0xed, 0x9c, 0x57, - 0x17, 0xdc, 0x97, 0x5c, 0x1c, 0xd7, 0x8a, 0x41, 0x01, 0xca, - 0x81, 0x4a, 0x0a, 0xc1, 0xe8, 0x23, 0x63, 0xa8, 0xe3, 0x28, - 0x68, 0xa3, 0xfe, 0x35, 0x75, 0xbe, 0xf5, 0x3e, 0x7e, 0xb5, - 0xc4, 0x0f, 0x4f, 0x84, 0xcf, 0x04, 0x44, 0x8f, 0xd2, 0x19, - 0x59, 0x92, 0xd9, 0x12, 0x52, 0x99, 0x7d, 0xb6, 0xf6, 0x3d, - 0x76, 0xbd, 0xfd, 0x36, 0x6b, 0xa0, 0xe0, 0x2b, 0x60, 0xab, - 0xeb, 0x20, 0x51, 0x9a, 0xda, 0x11, 0x5a, 0x91, 0xd1, 0x1a, - 0x47, 0x8c, 0xcc, 0x07, 0x4c, 0x87, 0xc7, 0x0c, 0x25, 0xee, - 0xae, 0x65, 0x2e, 0xe5, 0xa5, 0x6e, 0x33, 0xf8, 0xb8, 0x73, - 0x38, 0xf3, 0xb3, 0x78, 0x09, 0xc2, 0x82, 0x49, 0x02, 0xc9, - 0x89, 0x42, 0x1f, 0xd4, 0x94, 0x5f, 0x14, 0xdf, 0x9f, 0x54, - 0xcd, 0x06, 0x46, 0x8d, 0xc6, 0x0d, 0x4d, 0x86, 0xdb, 0x10, - 0x50, 0x9b, 0xd0, 0x1b, 0x5b, 0x90, 0xe1, 0x2a, 0x6a, 0xa1, - 0xea, 0x21, 0x61, 0xaa, 0xf7, 0x3c, 0x7c, 0xb7, 0xfc, 0x37, - 0x77, 0xbc, 0x95, 0x5e, 0x1e, 0xd5, 0x9e, 0x55, 0x15, 0xde, - 0x83, 0x48, 0x08, 0xc3, 0x88, 0x43, 0x03, 0xc8, 0xb9, 0x72, - 0x32, 0xf9, 0xb2, 0x79, 0x39, 0xf2, 0xaf, 0x64, 0x24, 0xef, - 0xa4, 0x6f, 0x2f, 0xe4, 0x00, 0xcc, 0x85, 0x49, 0x17, 0xdb, - 0x92, 0x5e, 0x2e, 0xe2, 0xab, 0x67, 0x39, 0xf5, 0xbc, 0x70, - 0x5c, 0x90, 0xd9, 0x15, 0x4b, 0x87, 0xce, 0x02, 0x72, 0xbe, - 0xf7, 0x3b, 0x65, 0xa9, 0xe0, 0x2c, 0xb8, 0x74, 0x3d, 0xf1, - 0xaf, 0x63, 0x2a, 0xe6, 0x96, 0x5a, 0x13, 0xdf, 0x81, 0x4d, - 0x04, 0xc8, 0xe4, 0x28, 0x61, 0xad, 0xf3, 0x3f, 0x76, 0xba, - 0xca, 0x06, 0x4f, 0x83, 0xdd, 0x11, 0x58, 0x94, 0x6d, 0xa1, - 0xe8, 0x24, 0x7a, 0xb6, 0xff, 0x33, 0x43, 0x8f, 0xc6, 0x0a, - 0x54, 0x98, 0xd1, 0x1d, 0x31, 0xfd, 0xb4, 0x78, 0x26, 0xea, - 0xa3, 0x6f, 0x1f, 0xd3, 0x9a, 0x56, 0x08, 0xc4, 0x8d, 0x41, - 0xd5, 0x19, 0x50, 0x9c, 0xc2, 0x0e, 0x47, 0x8b, 0xfb, 0x37, - 0x7e, 0xb2, 0xec, 0x20, 0x69, 0xa5, 0x89, 0x45, 0x0c, 0xc0, - 0x9e, 0x52, 0x1b, 0xd7, 0xa7, 0x6b, 0x22, 0xee, 0xb0, 0x7c, - 0x35, 0xf9, 0xda, 0x16, 0x5f, 0x93, 0xcd, 0x01, 0x48, 0x84, - 0xf4, 0x38, 0x71, 0xbd, 0xe3, 0x2f, 0x66, 0xaa, 0x86, 0x4a, - 0x03, 0xcf, 0x91, 0x5d, 0x14, 0xd8, 0xa8, 0x64, 0x2d, 0xe1, - 0xbf, 0x73, 0x3a, 0xf6, 0x62, 0xae, 0xe7, 0x2b, 0x75, 0xb9, - 0xf0, 0x3c, 0x4c, 0x80, 0xc9, 0x05, 0x5b, 0x97, 0xde, 0x12, - 0x3e, 0xf2, 0xbb, 0x77, 0x29, 0xe5, 0xac, 0x60, 0x10, 0xdc, - 0x95, 0x59, 0x07, 0xcb, 0x82, 0x4e, 0xb7, 0x7b, 0x32, 0xfe, - 0xa0, 0x6c, 0x25, 0xe9, 0x99, 0x55, 0x1c, 0xd0, 0x8e, 0x42, - 0x0b, 0xc7, 0xeb, 0x27, 0x6e, 0xa2, 0xfc, 0x30, 0x79, 0xb5, - 0xc5, 0x09, 0x40, 0x8c, 0xd2, 0x1e, 0x57, 0x9b, 0x0f, 0xc3, - 0x8a, 0x46, 0x18, 0xd4, 0x9d, 0x51, 0x21, 0xed, 0xa4, 0x68, - 0x36, 0xfa, 0xb3, 0x7f, 0x53, 0x9f, 0xd6, 0x1a, 0x44, 0x88, - 0xc1, 0x0d, 0x7d, 0xb1, 0xf8, 0x34, 0x6a, 0xa6, 0xef, 0x23, - 0x00, 0xcd, 0x87, 0x4a, 0x13, 0xde, 0x94, 0x59, 0x26, 0xeb, - 0xa1, 0x6c, 0x35, 0xf8, 0xb2, 0x7f, 0x4c, 0x81, 0xcb, 0x06, - 0x5f, 0x92, 0xd8, 0x15, 0x6a, 0xa7, 0xed, 0x20, 0x79, 0xb4, - 0xfe, 0x33, 0x98, 0x55, 0x1f, 0xd2, 0x8b, 0x46, 0x0c, 0xc1, - 0xbe, 0x73, 0x39, 0xf4, 0xad, 0x60, 0x2a, 0xe7, 0xd4, 0x19, - 0x53, 0x9e, 0xc7, 0x0a, 0x40, 0x8d, 0xf2, 0x3f, 0x75, 0xb8, - 0xe1, 0x2c, 0x66, 0xab, 0x2d, 0xe0, 0xaa, 0x67, 0x3e, 0xf3, - 0xb9, 0x74, 0x0b, 0xc6, 0x8c, 0x41, 0x18, 0xd5, 0x9f, 0x52, - 0x61, 0xac, 0xe6, 0x2b, 0x72, 0xbf, 0xf5, 0x38, 0x47, 0x8a, - 0xc0, 0x0d, 0x54, 0x99, 0xd3, 0x1e, 0xb5, 0x78, 0x32, 0xff, - 0xa6, 0x6b, 0x21, 0xec, 0x93, 0x5e, 0x14, 0xd9, 0x80, 0x4d, - 0x07, 0xca, 0xf9, 0x34, 0x7e, 0xb3, 0xea, 0x27, 0x6d, 0xa0, - 0xdf, 0x12, 0x58, 0x95, 0xcc, 0x01, 0x4b, 0x86, 0x5a, 0x97, - 0xdd, 0x10, 0x49, 0x84, 0xce, 0x03, 0x7c, 0xb1, 0xfb, 0x36, - 0x6f, 0xa2, 0xe8, 0x25, 0x16, 0xdb, 0x91, 0x5c, 0x05, 0xc8, - 0x82, 0x4f, 0x30, 0xfd, 0xb7, 0x7a, 0x23, 0xee, 0xa4, 0x69, - 0xc2, 0x0f, 0x45, 0x88, 0xd1, 0x1c, 0x56, 0x9b, 0xe4, 0x29, - 0x63, 0xae, 0xf7, 0x3a, 0x70, 0xbd, 0x8e, 0x43, 0x09, 0xc4, - 0x9d, 0x50, 0x1a, 0xd7, 0xa8, 0x65, 0x2f, 0xe2, 0xbb, 0x76, - 0x3c, 0xf1, 0x77, 0xba, 0xf0, 0x3d, 0x64, 0xa9, 0xe3, 0x2e, - 0x51, 0x9c, 0xd6, 0x1b, 0x42, 0x8f, 0xc5, 0x08, 0x3b, 0xf6, - 0xbc, 0x71, 0x28, 0xe5, 0xaf, 0x62, 0x1d, 0xd0, 0x9a, 0x57, - 0x0e, 0xc3, 0x89, 0x44, 0xef, 0x22, 0x68, 0xa5, 0xfc, 0x31, - 0x7b, 0xb6, 0xc9, 0x04, 0x4e, 0x83, 0xda, 0x17, 0x5d, 0x90, - 0xa3, 0x6e, 0x24, 0xe9, 0xb0, 0x7d, 0x37, 0xfa, 0x85, 0x48, - 0x02, 0xcf, 0x96, 0x5b, 0x11, 0xdc, 0x00, 0xce, 0x81, 0x4f, - 0x1f, 0xd1, 0x9e, 0x50, 0x3e, 0xf0, 0xbf, 0x71, 0x21, 0xef, - 0xa0, 0x6e, 0x7c, 0xb2, 0xfd, 0x33, 0x63, 0xad, 0xe2, 0x2c, - 0x42, 0x8c, 0xc3, 0x0d, 0x5d, 0x93, 0xdc, 0x12, 0xf8, 0x36, - 0x79, 0xb7, 0xe7, 0x29, 0x66, 0xa8, 0xc6, 0x08, 0x47, 0x89, - 0xd9, 0x17, 0x58, 0x96, 0x84, 0x4a, 0x05, 0xcb, 0x9b, 0x55, - 0x1a, 0xd4, 0xba, 0x74, 0x3b, 0xf5, 0xa5, 0x6b, 0x24, 0xea, - 0xed, 0x23, 0x6c, 0xa2, 0xf2, 0x3c, 0x73, 0xbd, 0xd3, 0x1d, - 0x52, 0x9c, 0xcc, 0x02, 0x4d, 0x83, 0x91, 0x5f, 0x10, 0xde, - 0x8e, 0x40, 0x0f, 0xc1, 0xaf, 0x61, 0x2e, 0xe0, 0xb0, 0x7e, - 0x31, 0xff, 0x15, 0xdb, 0x94, 0x5a, 0x0a, 0xc4, 0x8b, 0x45, - 0x2b, 0xe5, 0xaa, 0x64, 0x34, 0xfa, 0xb5, 0x7b, 0x69, 0xa7, - 0xe8, 0x26, 0x76, 0xb8, 0xf7, 0x39, 0x57, 0x99, 0xd6, 0x18, - 0x48, 0x86, 0xc9, 0x07, 0xc7, 0x09, 0x46, 0x88, 0xd8, 0x16, - 0x59, 0x97, 0xf9, 0x37, 0x78, 0xb6, 0xe6, 0x28, 0x67, 0xa9, - 0xbb, 0x75, 0x3a, 0xf4, 0xa4, 0x6a, 0x25, 0xeb, 0x85, 0x4b, - 0x04, 0xca, 0x9a, 0x54, 0x1b, 0xd5, 0x3f, 0xf1, 0xbe, 0x70, - 0x20, 0xee, 0xa1, 0x6f, 0x01, 0xcf, 0x80, 0x4e, 0x1e, 0xd0, - 0x9f, 0x51, 0x43, 0x8d, 0xc2, 0x0c, 0x5c, 0x92, 0xdd, 0x13, - 0x7d, 0xb3, 0xfc, 0x32, 0x62, 0xac, 0xe3, 0x2d, 0x2a, 0xe4, - 0xab, 0x65, 0x35, 0xfb, 0xb4, 0x7a, 0x14, 0xda, 0x95, 0x5b, - 0x0b, 0xc5, 0x8a, 0x44, 0x56, 0x98, 0xd7, 0x19, 0x49, 0x87, - 0xc8, 0x06, 0x68, 0xa6, 0xe9, 0x27, 0x77, 0xb9, 0xf6, 0x38, - 0xd2, 0x1c, 0x53, 0x9d, 0xcd, 0x03, 0x4c, 0x82, 0xec, 0x22, - 0x6d, 0xa3, 0xf3, 0x3d, 0x72, 0xbc, 0xae, 0x60, 0x2f, 0xe1, - 0xb1, 0x7f, 0x30, 0xfe, 0x90, 0x5e, 0x11, 0xdf, 0x8f, 0x41, - 0x0e, 0xc0, 0x00, 0xcf, 0x83, 0x4c, 0x1b, 0xd4, 0x98, 0x57, - 0x36, 0xf9, 0xb5, 0x7a, 0x2d, 0xe2, 0xae, 0x61, 0x6c, 0xa3, - 0xef, 0x20, 0x77, 0xb8, 0xf4, 0x3b, 0x5a, 0x95, 0xd9, 0x16, - 0x41, 0x8e, 0xc2, 0x0d, 0xd8, 0x17, 0x5b, 0x94, 0xc3, 0x0c, - 0x40, 0x8f, 0xee, 0x21, 0x6d, 0xa2, 0xf5, 0x3a, 0x76, 0xb9, - 0xb4, 0x7b, 0x37, 0xf8, 0xaf, 0x60, 0x2c, 0xe3, 0x82, 0x4d, - 0x01, 0xce, 0x99, 0x56, 0x1a, 0xd5, 0xad, 0x62, 0x2e, 0xe1, - 0xb6, 0x79, 0x35, 0xfa, 0x9b, 0x54, 0x18, 0xd7, 0x80, 0x4f, - 0x03, 0xcc, 0xc1, 0x0e, 0x42, 0x8d, 0xda, 0x15, 0x59, 0x96, - 0xf7, 0x38, 0x74, 0xbb, 0xec, 0x23, 0x6f, 0xa0, 0x75, 0xba, - 0xf6, 0x39, 0x6e, 0xa1, 0xed, 0x22, 0x43, 0x8c, 0xc0, 0x0f, - 0x58, 0x97, 0xdb, 0x14, 0x19, 0xd6, 0x9a, 0x55, 0x02, 0xcd, - 0x81, 0x4e, 0x2f, 0xe0, 0xac, 0x63, 0x34, 0xfb, 0xb7, 0x78, - 0x47, 0x88, 0xc4, 0x0b, 0x5c, 0x93, 0xdf, 0x10, 0x71, 0xbe, - 0xf2, 0x3d, 0x6a, 0xa5, 0xe9, 0x26, 0x2b, 0xe4, 0xa8, 0x67, - 0x30, 0xff, 0xb3, 0x7c, 0x1d, 0xd2, 0x9e, 0x51, 0x06, 0xc9, - 0x85, 0x4a, 0x9f, 0x50, 0x1c, 0xd3, 0x84, 0x4b, 0x07, 0xc8, - 0xa9, 0x66, 0x2a, 0xe5, 0xb2, 0x7d, 0x31, 0xfe, 0xf3, 0x3c, - 0x70, 0xbf, 0xe8, 0x27, 0x6b, 0xa4, 0xc5, 0x0a, 0x46, 0x89, - 0xde, 0x11, 0x5d, 0x92, 0xea, 0x25, 0x69, 0xa6, 0xf1, 0x3e, - 0x72, 0xbd, 0xdc, 0x13, 0x5f, 0x90, 0xc7, 0x08, 0x44, 0x8b, - 0x86, 0x49, 0x05, 0xca, 0x9d, 0x52, 0x1e, 0xd1, 0xb0, 0x7f, - 0x33, 0xfc, 0xab, 0x64, 0x28, 0xe7, 0x32, 0xfd, 0xb1, 0x7e, - 0x29, 0xe6, 0xaa, 0x65, 0x04, 0xcb, 0x87, 0x48, 0x1f, 0xd0, - 0x9c, 0x53, 0x5e, 0x91, 0xdd, 0x12, 0x45, 0x8a, 0xc6, 0x09, - 0x68, 0xa7, 0xeb, 0x24, 0x73, 0xbc, 0xf0, 0x3f, 0x00, 0xd0, - 0xbd, 0x6d, 0x67, 0xb7, 0xda, 0x0a, 0xce, 0x1e, 0x73, 0xa3, - 0xa9, 0x79, 0x14, 0xc4, 0x81, 0x51, 0x3c, 0xec, 0xe6, 0x36, - 0x5b, 0x8b, 0x4f, 0x9f, 0xf2, 0x22, 0x28, 0xf8, 0x95, 0x45, - 0x1f, 0xcf, 0xa2, 0x72, 0x78, 0xa8, 0xc5, 0x15, 0xd1, 0x01, - 0x6c, 0xbc, 0xb6, 0x66, 0x0b, 0xdb, 0x9e, 0x4e, 0x23, 0xf3, - 0xf9, 0x29, 0x44, 0x94, 0x50, 0x80, 0xed, 0x3d, 0x37, 0xe7, - 0x8a, 0x5a, 0x3e, 0xee, 0x83, 0x53, 0x59, 0x89, 0xe4, 0x34, - 0xf0, 0x20, 0x4d, 0x9d, 0x97, 0x47, 0x2a, 0xfa, 0xbf, 0x6f, - 0x02, 0xd2, 0xd8, 0x08, 0x65, 0xb5, 0x71, 0xa1, 0xcc, 0x1c, - 0x16, 0xc6, 0xab, 0x7b, 0x21, 0xf1, 0x9c, 0x4c, 0x46, 0x96, - 0xfb, 0x2b, 0xef, 0x3f, 0x52, 0x82, 0x88, 0x58, 0x35, 0xe5, - 0xa0, 0x70, 0x1d, 0xcd, 0xc7, 0x17, 0x7a, 0xaa, 0x6e, 0xbe, - 0xd3, 0x03, 0x09, 0xd9, 0xb4, 0x64, 0x7c, 0xac, 0xc1, 0x11, - 0x1b, 0xcb, 0xa6, 0x76, 0xb2, 0x62, 0x0f, 0xdf, 0xd5, 0x05, - 0x68, 0xb8, 0xfd, 0x2d, 0x40, 0x90, 0x9a, 0x4a, 0x27, 0xf7, - 0x33, 0xe3, 0x8e, 0x5e, 0x54, 0x84, 0xe9, 0x39, 0x63, 0xb3, - 0xde, 0x0e, 0x04, 0xd4, 0xb9, 0x69, 0xad, 0x7d, 0x10, 0xc0, - 0xca, 0x1a, 0x77, 0xa7, 0xe2, 0x32, 0x5f, 0x8f, 0x85, 0x55, - 0x38, 0xe8, 0x2c, 0xfc, 0x91, 0x41, 0x4b, 0x9b, 0xf6, 0x26, - 0x42, 0x92, 0xff, 0x2f, 0x25, 0xf5, 0x98, 0x48, 0x8c, 0x5c, - 0x31, 0xe1, 0xeb, 0x3b, 0x56, 0x86, 0xc3, 0x13, 0x7e, 0xae, - 0xa4, 0x74, 0x19, 0xc9, 0x0d, 0xdd, 0xb0, 0x60, 0x6a, 0xba, - 0xd7, 0x07, 0x5d, 0x8d, 0xe0, 0x30, 0x3a, 0xea, 0x87, 0x57, - 0x93, 0x43, 0x2e, 0xfe, 0xf4, 0x24, 0x49, 0x99, 0xdc, 0x0c, - 0x61, 0xb1, 0xbb, 0x6b, 0x06, 0xd6, 0x12, 0xc2, 0xaf, 0x7f, - 0x75, 0xa5, 0xc8, 0x18, 0x00, 0xd1, 0xbf, 0x6e, 0x63, 0xb2, - 0xdc, 0x0d, 0xc6, 0x17, 0x79, 0xa8, 0xa5, 0x74, 0x1a, 0xcb, - 0x91, 0x40, 0x2e, 0xff, 0xf2, 0x23, 0x4d, 0x9c, 0x57, 0x86, - 0xe8, 0x39, 0x34, 0xe5, 0x8b, 0x5a, 0x3f, 0xee, 0x80, 0x51, - 0x5c, 0x8d, 0xe3, 0x32, 0xf9, 0x28, 0x46, 0x97, 0x9a, 0x4b, - 0x25, 0xf4, 0xae, 0x7f, 0x11, 0xc0, 0xcd, 0x1c, 0x72, 0xa3, - 0x68, 0xb9, 0xd7, 0x06, 0x0b, 0xda, 0xb4, 0x65, 0x7e, 0xaf, - 0xc1, 0x10, 0x1d, 0xcc, 0xa2, 0x73, 0xb8, 0x69, 0x07, 0xd6, - 0xdb, 0x0a, 0x64, 0xb5, 0xef, 0x3e, 0x50, 0x81, 0x8c, 0x5d, - 0x33, 0xe2, 0x29, 0xf8, 0x96, 0x47, 0x4a, 0x9b, 0xf5, 0x24, - 0x41, 0x90, 0xfe, 0x2f, 0x22, 0xf3, 0x9d, 0x4c, 0x87, 0x56, - 0x38, 0xe9, 0xe4, 0x35, 0x5b, 0x8a, 0xd0, 0x01, 0x6f, 0xbe, - 0xb3, 0x62, 0x0c, 0xdd, 0x16, 0xc7, 0xa9, 0x78, 0x75, 0xa4, - 0xca, 0x1b, 0xfc, 0x2d, 0x43, 0x92, 0x9f, 0x4e, 0x20, 0xf1, - 0x3a, 0xeb, 0x85, 0x54, 0x59, 0x88, 0xe6, 0x37, 0x6d, 0xbc, - 0xd2, 0x03, 0x0e, 0xdf, 0xb1, 0x60, 0xab, 0x7a, 0x14, 0xc5, - 0xc8, 0x19, 0x77, 0xa6, 0xc3, 0x12, 0x7c, 0xad, 0xa0, 0x71, - 0x1f, 0xce, 0x05, 0xd4, 0xba, 0x6b, 0x66, 0xb7, 0xd9, 0x08, - 0x52, 0x83, 0xed, 0x3c, 0x31, 0xe0, 0x8e, 0x5f, 0x94, 0x45, - 0x2b, 0xfa, 0xf7, 0x26, 0x48, 0x99, 0x82, 0x53, 0x3d, 0xec, - 0xe1, 0x30, 0x5e, 0x8f, 0x44, 0x95, 0xfb, 0x2a, 0x27, 0xf6, - 0x98, 0x49, 0x13, 0xc2, 0xac, 0x7d, 0x70, 0xa1, 0xcf, 0x1e, - 0xd5, 0x04, 0x6a, 0xbb, 0xb6, 0x67, 0x09, 0xd8, 0xbd, 0x6c, - 0x02, 0xd3, 0xde, 0x0f, 0x61, 0xb0, 0x7b, 0xaa, 0xc4, 0x15, - 0x18, 0xc9, 0xa7, 0x76, 0x2c, 0xfd, 0x93, 0x42, 0x4f, 0x9e, - 0xf0, 0x21, 0xea, 0x3b, 0x55, 0x84, 0x89, 0x58, 0x36, 0xe7, - 0x00, 0xd2, 0xb9, 0x6b, 0x6f, 0xbd, 0xd6, 0x04, 0xde, 0x0c, - 0x67, 0xb5, 0xb1, 0x63, 0x08, 0xda, 0xa1, 0x73, 0x18, 0xca, - 0xce, 0x1c, 0x77, 0xa5, 0x7f, 0xad, 0xc6, 0x14, 0x10, 0xc2, - 0xa9, 0x7b, 0x5f, 0x8d, 0xe6, 0x34, 0x30, 0xe2, 0x89, 0x5b, - 0x81, 0x53, 0x38, 0xea, 0xee, 0x3c, 0x57, 0x85, 0xfe, 0x2c, - 0x47, 0x95, 0x91, 0x43, 0x28, 0xfa, 0x20, 0xf2, 0x99, 0x4b, - 0x4f, 0x9d, 0xf6, 0x24, 0xbe, 0x6c, 0x07, 0xd5, 0xd1, 0x03, - 0x68, 0xba, 0x60, 0xb2, 0xd9, 0x0b, 0x0f, 0xdd, 0xb6, 0x64, - 0x1f, 0xcd, 0xa6, 0x74, 0x70, 0xa2, 0xc9, 0x1b, 0xc1, 0x13, - 0x78, 0xaa, 0xae, 0x7c, 0x17, 0xc5, 0xe1, 0x33, 0x58, 0x8a, - 0x8e, 0x5c, 0x37, 0xe5, 0x3f, 0xed, 0x86, 0x54, 0x50, 0x82, - 0xe9, 0x3b, 0x40, 0x92, 0xf9, 0x2b, 0x2f, 0xfd, 0x96, 0x44, - 0x9e, 0x4c, 0x27, 0xf5, 0xf1, 0x23, 0x48, 0x9a, 0x61, 0xb3, - 0xd8, 0x0a, 0x0e, 0xdc, 0xb7, 0x65, 0xbf, 0x6d, 0x06, 0xd4, - 0xd0, 0x02, 0x69, 0xbb, 0xc0, 0x12, 0x79, 0xab, 0xaf, 0x7d, - 0x16, 0xc4, 0x1e, 0xcc, 0xa7, 0x75, 0x71, 0xa3, 0xc8, 0x1a, - 0x3e, 0xec, 0x87, 0x55, 0x51, 0x83, 0xe8, 0x3a, 0xe0, 0x32, - 0x59, 0x8b, 0x8f, 0x5d, 0x36, 0xe4, 0x9f, 0x4d, 0x26, 0xf4, - 0xf0, 0x22, 0x49, 0x9b, 0x41, 0x93, 0xf8, 0x2a, 0x2e, 0xfc, - 0x97, 0x45, 0xdf, 0x0d, 0x66, 0xb4, 0xb0, 0x62, 0x09, 0xdb, - 0x01, 0xd3, 0xb8, 0x6a, 0x6e, 0xbc, 0xd7, 0x05, 0x7e, 0xac, - 0xc7, 0x15, 0x11, 0xc3, 0xa8, 0x7a, 0xa0, 0x72, 0x19, 0xcb, - 0xcf, 0x1d, 0x76, 0xa4, 0x80, 0x52, 0x39, 0xeb, 0xef, 0x3d, - 0x56, 0x84, 0x5e, 0x8c, 0xe7, 0x35, 0x31, 0xe3, 0x88, 0x5a, - 0x21, 0xf3, 0x98, 0x4a, 0x4e, 0x9c, 0xf7, 0x25, 0xff, 0x2d, - 0x46, 0x94, 0x90, 0x42, 0x29, 0xfb, 0x00, 0xd3, 0xbb, 0x68, - 0x6b, 0xb8, 0xd0, 0x03, 0xd6, 0x05, 0x6d, 0xbe, 0xbd, 0x6e, - 0x06, 0xd5, 0xb1, 0x62, 0x0a, 0xd9, 0xda, 0x09, 0x61, 0xb2, - 0x67, 0xb4, 0xdc, 0x0f, 0x0c, 0xdf, 0xb7, 0x64, 0x7f, 0xac, - 0xc4, 0x17, 0x14, 0xc7, 0xaf, 0x7c, 0xa9, 0x7a, 0x12, 0xc1, - 0xc2, 0x11, 0x79, 0xaa, 0xce, 0x1d, 0x75, 0xa6, 0xa5, 0x76, - 0x1e, 0xcd, 0x18, 0xcb, 0xa3, 0x70, 0x73, 0xa0, 0xc8, 0x1b, - 0xfe, 0x2d, 0x45, 0x96, 0x95, 0x46, 0x2e, 0xfd, 0x28, 0xfb, - 0x93, 0x40, 0x43, 0x90, 0xf8, 0x2b, 0x4f, 0x9c, 0xf4, 0x27, - 0x24, 0xf7, 0x9f, 0x4c, 0x99, 0x4a, 0x22, 0xf1, 0xf2, 0x21, - 0x49, 0x9a, 0x81, 0x52, 0x3a, 0xe9, 0xea, 0x39, 0x51, 0x82, - 0x57, 0x84, 0xec, 0x3f, 0x3c, 0xef, 0x87, 0x54, 0x30, 0xe3, - 0x8b, 0x58, 0x5b, 0x88, 0xe0, 0x33, 0xe6, 0x35, 0x5d, 0x8e, - 0x8d, 0x5e, 0x36, 0xe5, 0xe1, 0x32, 0x5a, 0x89, 0x8a, 0x59, - 0x31, 0xe2, 0x37, 0xe4, 0x8c, 0x5f, 0x5c, 0x8f, 0xe7, 0x34, - 0x50, 0x83, 0xeb, 0x38, 0x3b, 0xe8, 0x80, 0x53, 0x86, 0x55, - 0x3d, 0xee, 0xed, 0x3e, 0x56, 0x85, 0x9e, 0x4d, 0x25, 0xf6, - 0xf5, 0x26, 0x4e, 0x9d, 0x48, 0x9b, 0xf3, 0x20, 0x23, 0xf0, - 0x98, 0x4b, 0x2f, 0xfc, 0x94, 0x47, 0x44, 0x97, 0xff, 0x2c, - 0xf9, 0x2a, 0x42, 0x91, 0x92, 0x41, 0x29, 0xfa, 0x1f, 0xcc, - 0xa4, 0x77, 0x74, 0xa7, 0xcf, 0x1c, 0xc9, 0x1a, 0x72, 0xa1, - 0xa2, 0x71, 0x19, 0xca, 0xae, 0x7d, 0x15, 0xc6, 0xc5, 0x16, - 0x7e, 0xad, 0x78, 0xab, 0xc3, 0x10, 0x13, 0xc0, 0xa8, 0x7b, - 0x60, 0xb3, 0xdb, 0x08, 0x0b, 0xd8, 0xb0, 0x63, 0xb6, 0x65, - 0x0d, 0xde, 0xdd, 0x0e, 0x66, 0xb5, 0xd1, 0x02, 0x6a, 0xb9, - 0xba, 0x69, 0x01, 0xd2, 0x07, 0xd4, 0xbc, 0x6f, 0x6c, 0xbf, - 0xd7, 0x04, 0x00, 0xd4, 0xb5, 0x61, 0x77, 0xa3, 0xc2, 0x16, - 0xee, 0x3a, 0x5b, 0x8f, 0x99, 0x4d, 0x2c, 0xf8, 0xc1, 0x15, - 0x74, 0xa0, 0xb6, 0x62, 0x03, 0xd7, 0x2f, 0xfb, 0x9a, 0x4e, - 0x58, 0x8c, 0xed, 0x39, 0x9f, 0x4b, 0x2a, 0xfe, 0xe8, 0x3c, - 0x5d, 0x89, 0x71, 0xa5, 0xc4, 0x10, 0x06, 0xd2, 0xb3, 0x67, - 0x5e, 0x8a, 0xeb, 0x3f, 0x29, 0xfd, 0x9c, 0x48, 0xb0, 0x64, - 0x05, 0xd1, 0xc7, 0x13, 0x72, 0xa6, 0x23, 0xf7, 0x96, 0x42, - 0x54, 0x80, 0xe1, 0x35, 0xcd, 0x19, 0x78, 0xac, 0xba, 0x6e, - 0x0f, 0xdb, 0xe2, 0x36, 0x57, 0x83, 0x95, 0x41, 0x20, 0xf4, - 0x0c, 0xd8, 0xb9, 0x6d, 0x7b, 0xaf, 0xce, 0x1a, 0xbc, 0x68, - 0x09, 0xdd, 0xcb, 0x1f, 0x7e, 0xaa, 0x52, 0x86, 0xe7, 0x33, - 0x25, 0xf1, 0x90, 0x44, 0x7d, 0xa9, 0xc8, 0x1c, 0x0a, 0xde, - 0xbf, 0x6b, 0x93, 0x47, 0x26, 0xf2, 0xe4, 0x30, 0x51, 0x85, - 0x46, 0x92, 0xf3, 0x27, 0x31, 0xe5, 0x84, 0x50, 0xa8, 0x7c, - 0x1d, 0xc9, 0xdf, 0x0b, 0x6a, 0xbe, 0x87, 0x53, 0x32, 0xe6, - 0xf0, 0x24, 0x45, 0x91, 0x69, 0xbd, 0xdc, 0x08, 0x1e, 0xca, - 0xab, 0x7f, 0xd9, 0x0d, 0x6c, 0xb8, 0xae, 0x7a, 0x1b, 0xcf, - 0x37, 0xe3, 0x82, 0x56, 0x40, 0x94, 0xf5, 0x21, 0x18, 0xcc, - 0xad, 0x79, 0x6f, 0xbb, 0xda, 0x0e, 0xf6, 0x22, 0x43, 0x97, - 0x81, 0x55, 0x34, 0xe0, 0x65, 0xb1, 0xd0, 0x04, 0x12, 0xc6, - 0xa7, 0x73, 0x8b, 0x5f, 0x3e, 0xea, 0xfc, 0x28, 0x49, 0x9d, - 0xa4, 0x70, 0x11, 0xc5, 0xd3, 0x07, 0x66, 0xb2, 0x4a, 0x9e, - 0xff, 0x2b, 0x3d, 0xe9, 0x88, 0x5c, 0xfa, 0x2e, 0x4f, 0x9b, - 0x8d, 0x59, 0x38, 0xec, 0x14, 0xc0, 0xa1, 0x75, 0x63, 0xb7, - 0xd6, 0x02, 0x3b, 0xef, 0x8e, 0x5a, 0x4c, 0x98, 0xf9, 0x2d, - 0xd5, 0x01, 0x60, 0xb4, 0xa2, 0x76, 0x17, 0xc3, 0x00, 0xd5, - 0xb7, 0x62, 0x73, 0xa6, 0xc4, 0x11, 0xe6, 0x33, 0x51, 0x84, - 0x95, 0x40, 0x22, 0xf7, 0xd1, 0x04, 0x66, 0xb3, 0xa2, 0x77, - 0x15, 0xc0, 0x37, 0xe2, 0x80, 0x55, 0x44, 0x91, 0xf3, 0x26, - 0xbf, 0x6a, 0x08, 0xdd, 0xcc, 0x19, 0x7b, 0xae, 0x59, 0x8c, - 0xee, 0x3b, 0x2a, 0xff, 0x9d, 0x48, 0x6e, 0xbb, 0xd9, 0x0c, - 0x1d, 0xc8, 0xaa, 0x7f, 0x88, 0x5d, 0x3f, 0xea, 0xfb, 0x2e, - 0x4c, 0x99, 0x63, 0xb6, 0xd4, 0x01, 0x10, 0xc5, 0xa7, 0x72, - 0x85, 0x50, 0x32, 0xe7, 0xf6, 0x23, 0x41, 0x94, 0xb2, 0x67, - 0x05, 0xd0, 0xc1, 0x14, 0x76, 0xa3, 0x54, 0x81, 0xe3, 0x36, - 0x27, 0xf2, 0x90, 0x45, 0xdc, 0x09, 0x6b, 0xbe, 0xaf, 0x7a, - 0x18, 0xcd, 0x3a, 0xef, 0x8d, 0x58, 0x49, 0x9c, 0xfe, 0x2b, - 0x0d, 0xd8, 0xba, 0x6f, 0x7e, 0xab, 0xc9, 0x1c, 0xeb, 0x3e, - 0x5c, 0x89, 0x98, 0x4d, 0x2f, 0xfa, 0xc6, 0x13, 0x71, 0xa4, - 0xb5, 0x60, 0x02, 0xd7, 0x20, 0xf5, 0x97, 0x42, 0x53, 0x86, - 0xe4, 0x31, 0x17, 0xc2, 0xa0, 0x75, 0x64, 0xb1, 0xd3, 0x06, - 0xf1, 0x24, 0x46, 0x93, 0x82, 0x57, 0x35, 0xe0, 0x79, 0xac, - 0xce, 0x1b, 0x0a, 0xdf, 0xbd, 0x68, 0x9f, 0x4a, 0x28, 0xfd, - 0xec, 0x39, 0x5b, 0x8e, 0xa8, 0x7d, 0x1f, 0xca, 0xdb, 0x0e, - 0x6c, 0xb9, 0x4e, 0x9b, 0xf9, 0x2c, 0x3d, 0xe8, 0x8a, 0x5f, - 0xa5, 0x70, 0x12, 0xc7, 0xd6, 0x03, 0x61, 0xb4, 0x43, 0x96, - 0xf4, 0x21, 0x30, 0xe5, 0x87, 0x52, 0x74, 0xa1, 0xc3, 0x16, - 0x07, 0xd2, 0xb0, 0x65, 0x92, 0x47, 0x25, 0xf0, 0xe1, 0x34, - 0x56, 0x83, 0x1a, 0xcf, 0xad, 0x78, 0x69, 0xbc, 0xde, 0x0b, - 0xfc, 0x29, 0x4b, 0x9e, 0x8f, 0x5a, 0x38, 0xed, 0xcb, 0x1e, - 0x7c, 0xa9, 0xb8, 0x6d, 0x0f, 0xda, 0x2d, 0xf8, 0x9a, 0x4f, - 0x5e, 0x8b, 0xe9, 0x3c, 0x00, 0xd6, 0xb1, 0x67, 0x7f, 0xa9, - 0xce, 0x18, 0xfe, 0x28, 0x4f, 0x99, 0x81, 0x57, 0x30, 0xe6, - 0xe1, 0x37, 0x50, 0x86, 0x9e, 0x48, 0x2f, 0xf9, 0x1f, 0xc9, - 0xae, 0x78, 0x60, 0xb6, 0xd1, 0x07, 0xdf, 0x09, 0x6e, 0xb8, - 0xa0, 0x76, 0x11, 0xc7, 0x21, 0xf7, 0x90, 0x46, 0x5e, 0x88, - 0xef, 0x39, 0x3e, 0xe8, 0x8f, 0x59, 0x41, 0x97, 0xf0, 0x26, - 0xc0, 0x16, 0x71, 0xa7, 0xbf, 0x69, 0x0e, 0xd8, 0xa3, 0x75, - 0x12, 0xc4, 0xdc, 0x0a, 0x6d, 0xbb, 0x5d, 0x8b, 0xec, 0x3a, - 0x22, 0xf4, 0x93, 0x45, 0x42, 0x94, 0xf3, 0x25, 0x3d, 0xeb, - 0x8c, 0x5a, 0xbc, 0x6a, 0x0d, 0xdb, 0xc3, 0x15, 0x72, 0xa4, - 0x7c, 0xaa, 0xcd, 0x1b, 0x03, 0xd5, 0xb2, 0x64, 0x82, 0x54, - 0x33, 0xe5, 0xfd, 0x2b, 0x4c, 0x9a, 0x9d, 0x4b, 0x2c, 0xfa, - 0xe2, 0x34, 0x53, 0x85, 0x63, 0xb5, 0xd2, 0x04, 0x1c, 0xca, - 0xad, 0x7b, 0x5b, 0x8d, 0xea, 0x3c, 0x24, 0xf2, 0x95, 0x43, - 0xa5, 0x73, 0x14, 0xc2, 0xda, 0x0c, 0x6b, 0xbd, 0xba, 0x6c, - 0x0b, 0xdd, 0xc5, 0x13, 0x74, 0xa2, 0x44, 0x92, 0xf5, 0x23, - 0x3b, 0xed, 0x8a, 0x5c, 0x84, 0x52, 0x35, 0xe3, 0xfb, 0x2d, - 0x4a, 0x9c, 0x7a, 0xac, 0xcb, 0x1d, 0x05, 0xd3, 0xb4, 0x62, - 0x65, 0xb3, 0xd4, 0x02, 0x1a, 0xcc, 0xab, 0x7d, 0x9b, 0x4d, - 0x2a, 0xfc, 0xe4, 0x32, 0x55, 0x83, 0xf8, 0x2e, 0x49, 0x9f, - 0x87, 0x51, 0x36, 0xe0, 0x06, 0xd0, 0xb7, 0x61, 0x79, 0xaf, - 0xc8, 0x1e, 0x19, 0xcf, 0xa8, 0x7e, 0x66, 0xb0, 0xd7, 0x01, - 0xe7, 0x31, 0x56, 0x80, 0x98, 0x4e, 0x29, 0xff, 0x27, 0xf1, - 0x96, 0x40, 0x58, 0x8e, 0xe9, 0x3f, 0xd9, 0x0f, 0x68, 0xbe, - 0xa6, 0x70, 0x17, 0xc1, 0xc6, 0x10, 0x77, 0xa1, 0xb9, 0x6f, - 0x08, 0xde, 0x38, 0xee, 0x89, 0x5f, 0x47, 0x91, 0xf6, 0x20, - 0x00, 0xd7, 0xb3, 0x64, 0x7b, 0xac, 0xc8, 0x1f, 0xf6, 0x21, - 0x45, 0x92, 0x8d, 0x5a, 0x3e, 0xe9, 0xf1, 0x26, 0x42, 0x95, - 0x8a, 0x5d, 0x39, 0xee, 0x07, 0xd0, 0xb4, 0x63, 0x7c, 0xab, - 0xcf, 0x18, 0xff, 0x28, 0x4c, 0x9b, 0x84, 0x53, 0x37, 0xe0, - 0x09, 0xde, 0xba, 0x6d, 0x72, 0xa5, 0xc1, 0x16, 0x0e, 0xd9, - 0xbd, 0x6a, 0x75, 0xa2, 0xc6, 0x11, 0xf8, 0x2f, 0x4b, 0x9c, - 0x83, 0x54, 0x30, 0xe7, 0xe3, 0x34, 0x50, 0x87, 0x98, 0x4f, - 0x2b, 0xfc, 0x15, 0xc2, 0xa6, 0x71, 0x6e, 0xb9, 0xdd, 0x0a, - 0x12, 0xc5, 0xa1, 0x76, 0x69, 0xbe, 0xda, 0x0d, 0xe4, 0x33, - 0x57, 0x80, 0x9f, 0x48, 0x2c, 0xfb, 0x1c, 0xcb, 0xaf, 0x78, - 0x67, 0xb0, 0xd4, 0x03, 0xea, 0x3d, 0x59, 0x8e, 0x91, 0x46, - 0x22, 0xf5, 0xed, 0x3a, 0x5e, 0x89, 0x96, 0x41, 0x25, 0xf2, - 0x1b, 0xcc, 0xa8, 0x7f, 0x60, 0xb7, 0xd3, 0x04, 0xdb, 0x0c, - 0x68, 0xbf, 0xa0, 0x77, 0x13, 0xc4, 0x2d, 0xfa, 0x9e, 0x49, - 0x56, 0x81, 0xe5, 0x32, 0x2a, 0xfd, 0x99, 0x4e, 0x51, 0x86, - 0xe2, 0x35, 0xdc, 0x0b, 0x6f, 0xb8, 0xa7, 0x70, 0x14, 0xc3, - 0x24, 0xf3, 0x97, 0x40, 0x5f, 0x88, 0xec, 0x3b, 0xd2, 0x05, - 0x61, 0xb6, 0xa9, 0x7e, 0x1a, 0xcd, 0xd5, 0x02, 0x66, 0xb1, - 0xae, 0x79, 0x1d, 0xca, 0x23, 0xf4, 0x90, 0x47, 0x58, 0x8f, - 0xeb, 0x3c, 0x38, 0xef, 0x8b, 0x5c, 0x43, 0x94, 0xf0, 0x27, - 0xce, 0x19, 0x7d, 0xaa, 0xb5, 0x62, 0x06, 0xd1, 0xc9, 0x1e, - 0x7a, 0xad, 0xb2, 0x65, 0x01, 0xd6, 0x3f, 0xe8, 0x8c, 0x5b, - 0x44, 0x93, 0xf7, 0x20, 0xc7, 0x10, 0x74, 0xa3, 0xbc, 0x6b, - 0x0f, 0xd8, 0x31, 0xe6, 0x82, 0x55, 0x4a, 0x9d, 0xf9, 0x2e, - 0x36, 0xe1, 0x85, 0x52, 0x4d, 0x9a, 0xfe, 0x29, 0xc0, 0x17, - 0x73, 0xa4, 0xbb, 0x6c, 0x08, 0xdf, 0x00, 0xd8, 0xad, 0x75, - 0x47, 0x9f, 0xea, 0x32, 0x8e, 0x56, 0x23, 0xfb, 0xc9, 0x11, - 0x64, 0xbc, 0x01, 0xd9, 0xac, 0x74, 0x46, 0x9e, 0xeb, 0x33, - 0x8f, 0x57, 0x22, 0xfa, 0xc8, 0x10, 0x65, 0xbd, 0x02, 0xda, - 0xaf, 0x77, 0x45, 0x9d, 0xe8, 0x30, 0x8c, 0x54, 0x21, 0xf9, - 0xcb, 0x13, 0x66, 0xbe, 0x03, 0xdb, 0xae, 0x76, 0x44, 0x9c, - 0xe9, 0x31, 0x8d, 0x55, 0x20, 0xf8, 0xca, 0x12, 0x67, 0xbf, - 0x04, 0xdc, 0xa9, 0x71, 0x43, 0x9b, 0xee, 0x36, 0x8a, 0x52, - 0x27, 0xff, 0xcd, 0x15, 0x60, 0xb8, 0x05, 0xdd, 0xa8, 0x70, - 0x42, 0x9a, 0xef, 0x37, 0x8b, 0x53, 0x26, 0xfe, 0xcc, 0x14, - 0x61, 0xb9, 0x06, 0xde, 0xab, 0x73, 0x41, 0x99, 0xec, 0x34, - 0x88, 0x50, 0x25, 0xfd, 0xcf, 0x17, 0x62, 0xba, 0x07, 0xdf, - 0xaa, 0x72, 0x40, 0x98, 0xed, 0x35, 0x89, 0x51, 0x24, 0xfc, - 0xce, 0x16, 0x63, 0xbb, 0x08, 0xd0, 0xa5, 0x7d, 0x4f, 0x97, - 0xe2, 0x3a, 0x86, 0x5e, 0x2b, 0xf3, 0xc1, 0x19, 0x6c, 0xb4, - 0x09, 0xd1, 0xa4, 0x7c, 0x4e, 0x96, 0xe3, 0x3b, 0x87, 0x5f, - 0x2a, 0xf2, 0xc0, 0x18, 0x6d, 0xb5, 0x0a, 0xd2, 0xa7, 0x7f, - 0x4d, 0x95, 0xe0, 0x38, 0x84, 0x5c, 0x29, 0xf1, 0xc3, 0x1b, - 0x6e, 0xb6, 0x0b, 0xd3, 0xa6, 0x7e, 0x4c, 0x94, 0xe1, 0x39, - 0x85, 0x5d, 0x28, 0xf0, 0xc2, 0x1a, 0x6f, 0xb7, 0x0c, 0xd4, - 0xa1, 0x79, 0x4b, 0x93, 0xe6, 0x3e, 0x82, 0x5a, 0x2f, 0xf7, - 0xc5, 0x1d, 0x68, 0xb0, 0x0d, 0xd5, 0xa0, 0x78, 0x4a, 0x92, - 0xe7, 0x3f, 0x83, 0x5b, 0x2e, 0xf6, 0xc4, 0x1c, 0x69, 0xb1, - 0x0e, 0xd6, 0xa3, 0x7b, 0x49, 0x91, 0xe4, 0x3c, 0x80, 0x58, - 0x2d, 0xf5, 0xc7, 0x1f, 0x6a, 0xb2, 0x0f, 0xd7, 0xa2, 0x7a, - 0x48, 0x90, 0xe5, 0x3d, 0x81, 0x59, 0x2c, 0xf4, 0xc6, 0x1e, - 0x6b, 0xb3, 0x00, 0xd9, 0xaf, 0x76, 0x43, 0x9a, 0xec, 0x35, - 0x86, 0x5f, 0x29, 0xf0, 0xc5, 0x1c, 0x6a, 0xb3, 0x11, 0xc8, - 0xbe, 0x67, 0x52, 0x8b, 0xfd, 0x24, 0x97, 0x4e, 0x38, 0xe1, - 0xd4, 0x0d, 0x7b, 0xa2, 0x22, 0xfb, 0x8d, 0x54, 0x61, 0xb8, - 0xce, 0x17, 0xa4, 0x7d, 0x0b, 0xd2, 0xe7, 0x3e, 0x48, 0x91, - 0x33, 0xea, 0x9c, 0x45, 0x70, 0xa9, 0xdf, 0x06, 0xb5, 0x6c, - 0x1a, 0xc3, 0xf6, 0x2f, 0x59, 0x80, 0x44, 0x9d, 0xeb, 0x32, - 0x07, 0xde, 0xa8, 0x71, 0xc2, 0x1b, 0x6d, 0xb4, 0x81, 0x58, - 0x2e, 0xf7, 0x55, 0x8c, 0xfa, 0x23, 0x16, 0xcf, 0xb9, 0x60, - 0xd3, 0x0a, 0x7c, 0xa5, 0x90, 0x49, 0x3f, 0xe6, 0x66, 0xbf, - 0xc9, 0x10, 0x25, 0xfc, 0x8a, 0x53, 0xe0, 0x39, 0x4f, 0x96, - 0xa3, 0x7a, 0x0c, 0xd5, 0x77, 0xae, 0xd8, 0x01, 0x34, 0xed, - 0x9b, 0x42, 0xf1, 0x28, 0x5e, 0x87, 0xb2, 0x6b, 0x1d, 0xc4, - 0x88, 0x51, 0x27, 0xfe, 0xcb, 0x12, 0x64, 0xbd, 0x0e, 0xd7, - 0xa1, 0x78, 0x4d, 0x94, 0xe2, 0x3b, 0x99, 0x40, 0x36, 0xef, - 0xda, 0x03, 0x75, 0xac, 0x1f, 0xc6, 0xb0, 0x69, 0x5c, 0x85, - 0xf3, 0x2a, 0xaa, 0x73, 0x05, 0xdc, 0xe9, 0x30, 0x46, 0x9f, - 0x2c, 0xf5, 0x83, 0x5a, 0x6f, 0xb6, 0xc0, 0x19, 0xbb, 0x62, - 0x14, 0xcd, 0xf8, 0x21, 0x57, 0x8e, 0x3d, 0xe4, 0x92, 0x4b, - 0x7e, 0xa7, 0xd1, 0x08, 0xcc, 0x15, 0x63, 0xba, 0x8f, 0x56, - 0x20, 0xf9, 0x4a, 0x93, 0xe5, 0x3c, 0x09, 0xd0, 0xa6, 0x7f, - 0xdd, 0x04, 0x72, 0xab, 0x9e, 0x47, 0x31, 0xe8, 0x5b, 0x82, - 0xf4, 0x2d, 0x18, 0xc1, 0xb7, 0x6e, 0xee, 0x37, 0x41, 0x98, - 0xad, 0x74, 0x02, 0xdb, 0x68, 0xb1, 0xc7, 0x1e, 0x2b, 0xf2, - 0x84, 0x5d, 0xff, 0x26, 0x50, 0x89, 0xbc, 0x65, 0x13, 0xca, - 0x79, 0xa0, 0xd6, 0x0f, 0x3a, 0xe3, 0x95, 0x4c, 0x00, 0xda, - 0xa9, 0x73, 0x4f, 0x95, 0xe6, 0x3c, 0x9e, 0x44, 0x37, 0xed, - 0xd1, 0x0b, 0x78, 0xa2, 0x21, 0xfb, 0x88, 0x52, 0x6e, 0xb4, - 0xc7, 0x1d, 0xbf, 0x65, 0x16, 0xcc, 0xf0, 0x2a, 0x59, 0x83, - 0x42, 0x98, 0xeb, 0x31, 0x0d, 0xd7, 0xa4, 0x7e, 0xdc, 0x06, - 0x75, 0xaf, 0x93, 0x49, 0x3a, 0xe0, 0x63, 0xb9, 0xca, 0x10, - 0x2c, 0xf6, 0x85, 0x5f, 0xfd, 0x27, 0x54, 0x8e, 0xb2, 0x68, - 0x1b, 0xc1, 0x84, 0x5e, 0x2d, 0xf7, 0xcb, 0x11, 0x62, 0xb8, - 0x1a, 0xc0, 0xb3, 0x69, 0x55, 0x8f, 0xfc, 0x26, 0xa5, 0x7f, - 0x0c, 0xd6, 0xea, 0x30, 0x43, 0x99, 0x3b, 0xe1, 0x92, 0x48, - 0x74, 0xae, 0xdd, 0x07, 0xc6, 0x1c, 0x6f, 0xb5, 0x89, 0x53, - 0x20, 0xfa, 0x58, 0x82, 0xf1, 0x2b, 0x17, 0xcd, 0xbe, 0x64, - 0xe7, 0x3d, 0x4e, 0x94, 0xa8, 0x72, 0x01, 0xdb, 0x79, 0xa3, - 0xd0, 0x0a, 0x36, 0xec, 0x9f, 0x45, 0x15, 0xcf, 0xbc, 0x66, - 0x5a, 0x80, 0xf3, 0x29, 0x8b, 0x51, 0x22, 0xf8, 0xc4, 0x1e, - 0x6d, 0xb7, 0x34, 0xee, 0x9d, 0x47, 0x7b, 0xa1, 0xd2, 0x08, - 0xaa, 0x70, 0x03, 0xd9, 0xe5, 0x3f, 0x4c, 0x96, 0x57, 0x8d, - 0xfe, 0x24, 0x18, 0xc2, 0xb1, 0x6b, 0xc9, 0x13, 0x60, 0xba, - 0x86, 0x5c, 0x2f, 0xf5, 0x76, 0xac, 0xdf, 0x05, 0x39, 0xe3, - 0x90, 0x4a, 0xe8, 0x32, 0x41, 0x9b, 0xa7, 0x7d, 0x0e, 0xd4, - 0x91, 0x4b, 0x38, 0xe2, 0xde, 0x04, 0x77, 0xad, 0x0f, 0xd5, - 0xa6, 0x7c, 0x40, 0x9a, 0xe9, 0x33, 0xb0, 0x6a, 0x19, 0xc3, - 0xff, 0x25, 0x56, 0x8c, 0x2e, 0xf4, 0x87, 0x5d, 0x61, 0xbb, - 0xc8, 0x12, 0xd3, 0x09, 0x7a, 0xa0, 0x9c, 0x46, 0x35, 0xef, - 0x4d, 0x97, 0xe4, 0x3e, 0x02, 0xd8, 0xab, 0x71, 0xf2, 0x28, - 0x5b, 0x81, 0xbd, 0x67, 0x14, 0xce, 0x6c, 0xb6, 0xc5, 0x1f, - 0x23, 0xf9, 0x8a, 0x50, 0x00, 0xdb, 0xab, 0x70, 0x4b, 0x90, - 0xe0, 0x3b, 0x96, 0x4d, 0x3d, 0xe6, 0xdd, 0x06, 0x76, 0xad, - 0x31, 0xea, 0x9a, 0x41, 0x7a, 0xa1, 0xd1, 0x0a, 0xa7, 0x7c, - 0x0c, 0xd7, 0xec, 0x37, 0x47, 0x9c, 0x62, 0xb9, 0xc9, 0x12, - 0x29, 0xf2, 0x82, 0x59, 0xf4, 0x2f, 0x5f, 0x84, 0xbf, 0x64, - 0x14, 0xcf, 0x53, 0x88, 0xf8, 0x23, 0x18, 0xc3, 0xb3, 0x68, - 0xc5, 0x1e, 0x6e, 0xb5, 0x8e, 0x55, 0x25, 0xfe, 0xc4, 0x1f, - 0x6f, 0xb4, 0x8f, 0x54, 0x24, 0xff, 0x52, 0x89, 0xf9, 0x22, - 0x19, 0xc2, 0xb2, 0x69, 0xf5, 0x2e, 0x5e, 0x85, 0xbe, 0x65, - 0x15, 0xce, 0x63, 0xb8, 0xc8, 0x13, 0x28, 0xf3, 0x83, 0x58, - 0xa6, 0x7d, 0x0d, 0xd6, 0xed, 0x36, 0x46, 0x9d, 0x30, 0xeb, - 0x9b, 0x40, 0x7b, 0xa0, 0xd0, 0x0b, 0x97, 0x4c, 0x3c, 0xe7, - 0xdc, 0x07, 0x77, 0xac, 0x01, 0xda, 0xaa, 0x71, 0x4a, 0x91, - 0xe1, 0x3a, 0x95, 0x4e, 0x3e, 0xe5, 0xde, 0x05, 0x75, 0xae, - 0x03, 0xd8, 0xa8, 0x73, 0x48, 0x93, 0xe3, 0x38, 0xa4, 0x7f, - 0x0f, 0xd4, 0xef, 0x34, 0x44, 0x9f, 0x32, 0xe9, 0x99, 0x42, - 0x79, 0xa2, 0xd2, 0x09, 0xf7, 0x2c, 0x5c, 0x87, 0xbc, 0x67, - 0x17, 0xcc, 0x61, 0xba, 0xca, 0x11, 0x2a, 0xf1, 0x81, 0x5a, - 0xc6, 0x1d, 0x6d, 0xb6, 0x8d, 0x56, 0x26, 0xfd, 0x50, 0x8b, - 0xfb, 0x20, 0x1b, 0xc0, 0xb0, 0x6b, 0x51, 0x8a, 0xfa, 0x21, - 0x1a, 0xc1, 0xb1, 0x6a, 0xc7, 0x1c, 0x6c, 0xb7, 0x8c, 0x57, - 0x27, 0xfc, 0x60, 0xbb, 0xcb, 0x10, 0x2b, 0xf0, 0x80, 0x5b, - 0xf6, 0x2d, 0x5d, 0x86, 0xbd, 0x66, 0x16, 0xcd, 0x33, 0xe8, - 0x98, 0x43, 0x78, 0xa3, 0xd3, 0x08, 0xa5, 0x7e, 0x0e, 0xd5, - 0xee, 0x35, 0x45, 0x9e, 0x02, 0xd9, 0xa9, 0x72, 0x49, 0x92, - 0xe2, 0x39, 0x94, 0x4f, 0x3f, 0xe4, 0xdf, 0x04, 0x74, 0xaf, - 0x00, 0xdc, 0xa5, 0x79, 0x57, 0x8b, 0xf2, 0x2e, 0xae, 0x72, - 0x0b, 0xd7, 0xf9, 0x25, 0x5c, 0x80, 0x41, 0x9d, 0xe4, 0x38, - 0x16, 0xca, 0xb3, 0x6f, 0xef, 0x33, 0x4a, 0x96, 0xb8, 0x64, - 0x1d, 0xc1, 0x82, 0x5e, 0x27, 0xfb, 0xd5, 0x09, 0x70, 0xac, - 0x2c, 0xf0, 0x89, 0x55, 0x7b, 0xa7, 0xde, 0x02, 0xc3, 0x1f, - 0x66, 0xba, 0x94, 0x48, 0x31, 0xed, 0x6d, 0xb1, 0xc8, 0x14, - 0x3a, 0xe6, 0x9f, 0x43, 0x19, 0xc5, 0xbc, 0x60, 0x4e, 0x92, - 0xeb, 0x37, 0xb7, 0x6b, 0x12, 0xce, 0xe0, 0x3c, 0x45, 0x99, - 0x58, 0x84, 0xfd, 0x21, 0x0f, 0xd3, 0xaa, 0x76, 0xf6, 0x2a, - 0x53, 0x8f, 0xa1, 0x7d, 0x04, 0xd8, 0x9b, 0x47, 0x3e, 0xe2, - 0xcc, 0x10, 0x69, 0xb5, 0x35, 0xe9, 0x90, 0x4c, 0x62, 0xbe, - 0xc7, 0x1b, 0xda, 0x06, 0x7f, 0xa3, 0x8d, 0x51, 0x28, 0xf4, - 0x74, 0xa8, 0xd1, 0x0d, 0x23, 0xff, 0x86, 0x5a, 0x32, 0xee, - 0x97, 0x4b, 0x65, 0xb9, 0xc0, 0x1c, 0x9c, 0x40, 0x39, 0xe5, - 0xcb, 0x17, 0x6e, 0xb2, 0x73, 0xaf, 0xd6, 0x0a, 0x24, 0xf8, - 0x81, 0x5d, 0xdd, 0x01, 0x78, 0xa4, 0x8a, 0x56, 0x2f, 0xf3, - 0xb0, 0x6c, 0x15, 0xc9, 0xe7, 0x3b, 0x42, 0x9e, 0x1e, 0xc2, - 0xbb, 0x67, 0x49, 0x95, 0xec, 0x30, 0xf1, 0x2d, 0x54, 0x88, - 0xa6, 0x7a, 0x03, 0xdf, 0x5f, 0x83, 0xfa, 0x26, 0x08, 0xd4, - 0xad, 0x71, 0x2b, 0xf7, 0x8e, 0x52, 0x7c, 0xa0, 0xd9, 0x05, - 0x85, 0x59, 0x20, 0xfc, 0xd2, 0x0e, 0x77, 0xab, 0x6a, 0xb6, - 0xcf, 0x13, 0x3d, 0xe1, 0x98, 0x44, 0xc4, 0x18, 0x61, 0xbd, - 0x93, 0x4f, 0x36, 0xea, 0xa9, 0x75, 0x0c, 0xd0, 0xfe, 0x22, - 0x5b, 0x87, 0x07, 0xdb, 0xa2, 0x7e, 0x50, 0x8c, 0xf5, 0x29, - 0xe8, 0x34, 0x4d, 0x91, 0xbf, 0x63, 0x1a, 0xc6, 0x46, 0x9a, - 0xe3, 0x3f, 0x11, 0xcd, 0xb4, 0x68, 0x00, 0xdd, 0xa7, 0x7a, - 0x53, 0x8e, 0xf4, 0x29, 0xa6, 0x7b, 0x01, 0xdc, 0xf5, 0x28, - 0x52, 0x8f, 0x51, 0x8c, 0xf6, 0x2b, 0x02, 0xdf, 0xa5, 0x78, - 0xf7, 0x2a, 0x50, 0x8d, 0xa4, 0x79, 0x03, 0xde, 0xa2, 0x7f, - 0x05, 0xd8, 0xf1, 0x2c, 0x56, 0x8b, 0x04, 0xd9, 0xa3, 0x7e, - 0x57, 0x8a, 0xf0, 0x2d, 0xf3, 0x2e, 0x54, 0x89, 0xa0, 0x7d, - 0x07, 0xda, 0x55, 0x88, 0xf2, 0x2f, 0x06, 0xdb, 0xa1, 0x7c, - 0x59, 0x84, 0xfe, 0x23, 0x0a, 0xd7, 0xad, 0x70, 0xff, 0x22, - 0x58, 0x85, 0xac, 0x71, 0x0b, 0xd6, 0x08, 0xd5, 0xaf, 0x72, - 0x5b, 0x86, 0xfc, 0x21, 0xae, 0x73, 0x09, 0xd4, 0xfd, 0x20, - 0x5a, 0x87, 0xfb, 0x26, 0x5c, 0x81, 0xa8, 0x75, 0x0f, 0xd2, - 0x5d, 0x80, 0xfa, 0x27, 0x0e, 0xd3, 0xa9, 0x74, 0xaa, 0x77, - 0x0d, 0xd0, 0xf9, 0x24, 0x5e, 0x83, 0x0c, 0xd1, 0xab, 0x76, - 0x5f, 0x82, 0xf8, 0x25, 0xb2, 0x6f, 0x15, 0xc8, 0xe1, 0x3c, - 0x46, 0x9b, 0x14, 0xc9, 0xb3, 0x6e, 0x47, 0x9a, 0xe0, 0x3d, - 0xe3, 0x3e, 0x44, 0x99, 0xb0, 0x6d, 0x17, 0xca, 0x45, 0x98, - 0xe2, 0x3f, 0x16, 0xcb, 0xb1, 0x6c, 0x10, 0xcd, 0xb7, 0x6a, - 0x43, 0x9e, 0xe4, 0x39, 0xb6, 0x6b, 0x11, 0xcc, 0xe5, 0x38, - 0x42, 0x9f, 0x41, 0x9c, 0xe6, 0x3b, 0x12, 0xcf, 0xb5, 0x68, - 0xe7, 0x3a, 0x40, 0x9d, 0xb4, 0x69, 0x13, 0xce, 0xeb, 0x36, - 0x4c, 0x91, 0xb8, 0x65, 0x1f, 0xc2, 0x4d, 0x90, 0xea, 0x37, - 0x1e, 0xc3, 0xb9, 0x64, 0xba, 0x67, 0x1d, 0xc0, 0xe9, 0x34, - 0x4e, 0x93, 0x1c, 0xc1, 0xbb, 0x66, 0x4f, 0x92, 0xe8, 0x35, - 0x49, 0x94, 0xee, 0x33, 0x1a, 0xc7, 0xbd, 0x60, 0xef, 0x32, - 0x48, 0x95, 0xbc, 0x61, 0x1b, 0xc6, 0x18, 0xc5, 0xbf, 0x62, - 0x4b, 0x96, 0xec, 0x31, 0xbe, 0x63, 0x19, 0xc4, 0xed, 0x30, - 0x4a, 0x97, 0x00, 0xde, 0xa1, 0x7f, 0x5f, 0x81, 0xfe, 0x20, - 0xbe, 0x60, 0x1f, 0xc1, 0xe1, 0x3f, 0x40, 0x9e, 0x61, 0xbf, - 0xc0, 0x1e, 0x3e, 0xe0, 0x9f, 0x41, 0xdf, 0x01, 0x7e, 0xa0, - 0x80, 0x5e, 0x21, 0xff, 0xc2, 0x1c, 0x63, 0xbd, 0x9d, 0x43, - 0x3c, 0xe2, 0x7c, 0xa2, 0xdd, 0x03, 0x23, 0xfd, 0x82, 0x5c, - 0xa3, 0x7d, 0x02, 0xdc, 0xfc, 0x22, 0x5d, 0x83, 0x1d, 0xc3, - 0xbc, 0x62, 0x42, 0x9c, 0xe3, 0x3d, 0x99, 0x47, 0x38, 0xe6, - 0xc6, 0x18, 0x67, 0xb9, 0x27, 0xf9, 0x86, 0x58, 0x78, 0xa6, - 0xd9, 0x07, 0xf8, 0x26, 0x59, 0x87, 0xa7, 0x79, 0x06, 0xd8, - 0x46, 0x98, 0xe7, 0x39, 0x19, 0xc7, 0xb8, 0x66, 0x5b, 0x85, - 0xfa, 0x24, 0x04, 0xda, 0xa5, 0x7b, 0xe5, 0x3b, 0x44, 0x9a, - 0xba, 0x64, 0x1b, 0xc5, 0x3a, 0xe4, 0x9b, 0x45, 0x65, 0xbb, - 0xc4, 0x1a, 0x84, 0x5a, 0x25, 0xfb, 0xdb, 0x05, 0x7a, 0xa4, - 0x2f, 0xf1, 0x8e, 0x50, 0x70, 0xae, 0xd1, 0x0f, 0x91, 0x4f, - 0x30, 0xee, 0xce, 0x10, 0x6f, 0xb1, 0x4e, 0x90, 0xef, 0x31, - 0x11, 0xcf, 0xb0, 0x6e, 0xf0, 0x2e, 0x51, 0x8f, 0xaf, 0x71, - 0x0e, 0xd0, 0xed, 0x33, 0x4c, 0x92, 0xb2, 0x6c, 0x13, 0xcd, - 0x53, 0x8d, 0xf2, 0x2c, 0x0c, 0xd2, 0xad, 0x73, 0x8c, 0x52, - 0x2d, 0xf3, 0xd3, 0x0d, 0x72, 0xac, 0x32, 0xec, 0x93, 0x4d, - 0x6d, 0xb3, 0xcc, 0x12, 0xb6, 0x68, 0x17, 0xc9, 0xe9, 0x37, - 0x48, 0x96, 0x08, 0xd6, 0xa9, 0x77, 0x57, 0x89, 0xf6, 0x28, - 0xd7, 0x09, 0x76, 0xa8, 0x88, 0x56, 0x29, 0xf7, 0x69, 0xb7, - 0xc8, 0x16, 0x36, 0xe8, 0x97, 0x49, 0x74, 0xaa, 0xd5, 0x0b, - 0x2b, 0xf5, 0x8a, 0x54, 0xca, 0x14, 0x6b, 0xb5, 0x95, 0x4b, - 0x34, 0xea, 0x15, 0xcb, 0xb4, 0x6a, 0x4a, 0x94, 0xeb, 0x35, - 0xab, 0x75, 0x0a, 0xd4, 0xf4, 0x2a, 0x55, 0x8b, 0x00, 0xdf, - 0xa3, 0x7c, 0x5b, 0x84, 0xf8, 0x27, 0xb6, 0x69, 0x15, 0xca, - 0xed, 0x32, 0x4e, 0x91, 0x71, 0xae, 0xd2, 0x0d, 0x2a, 0xf5, - 0x89, 0x56, 0xc7, 0x18, 0x64, 0xbb, 0x9c, 0x43, 0x3f, 0xe0, - 0xe2, 0x3d, 0x41, 0x9e, 0xb9, 0x66, 0x1a, 0xc5, 0x54, 0x8b, - 0xf7, 0x28, 0x0f, 0xd0, 0xac, 0x73, 0x93, 0x4c, 0x30, 0xef, - 0xc8, 0x17, 0x6b, 0xb4, 0x25, 0xfa, 0x86, 0x59, 0x7e, 0xa1, - 0xdd, 0x02, 0xd9, 0x06, 0x7a, 0xa5, 0x82, 0x5d, 0x21, 0xfe, - 0x6f, 0xb0, 0xcc, 0x13, 0x34, 0xeb, 0x97, 0x48, 0xa8, 0x77, - 0x0b, 0xd4, 0xf3, 0x2c, 0x50, 0x8f, 0x1e, 0xc1, 0xbd, 0x62, - 0x45, 0x9a, 0xe6, 0x39, 0x3b, 0xe4, 0x98, 0x47, 0x60, 0xbf, - 0xc3, 0x1c, 0x8d, 0x52, 0x2e, 0xf1, 0xd6, 0x09, 0x75, 0xaa, - 0x4a, 0x95, 0xe9, 0x36, 0x11, 0xce, 0xb2, 0x6d, 0xfc, 0x23, - 0x5f, 0x80, 0xa7, 0x78, 0x04, 0xdb, 0xaf, 0x70, 0x0c, 0xd3, - 0xf4, 0x2b, 0x57, 0x88, 0x19, 0xc6, 0xba, 0x65, 0x42, 0x9d, - 0xe1, 0x3e, 0xde, 0x01, 0x7d, 0xa2, 0x85, 0x5a, 0x26, 0xf9, - 0x68, 0xb7, 0xcb, 0x14, 0x33, 0xec, 0x90, 0x4f, 0x4d, 0x92, - 0xee, 0x31, 0x16, 0xc9, 0xb5, 0x6a, 0xfb, 0x24, 0x58, 0x87, - 0xa0, 0x7f, 0x03, 0xdc, 0x3c, 0xe3, 0x9f, 0x40, 0x67, 0xb8, - 0xc4, 0x1b, 0x8a, 0x55, 0x29, 0xf6, 0xd1, 0x0e, 0x72, 0xad, - 0x76, 0xa9, 0xd5, 0x0a, 0x2d, 0xf2, 0x8e, 0x51, 0xc0, 0x1f, - 0x63, 0xbc, 0x9b, 0x44, 0x38, 0xe7, 0x07, 0xd8, 0xa4, 0x7b, - 0x5c, 0x83, 0xff, 0x20, 0xb1, 0x6e, 0x12, 0xcd, 0xea, 0x35, - 0x49, 0x96, 0x94, 0x4b, 0x37, 0xe8, 0xcf, 0x10, 0x6c, 0xb3, - 0x22, 0xfd, 0x81, 0x5e, 0x79, 0xa6, 0xda, 0x05, 0xe5, 0x3a, - 0x46, 0x99, 0xbe, 0x61, 0x1d, 0xc2, 0x53, 0x8c, 0xf0, 0x2f, - 0x08, 0xd7, 0xab, 0x74, 0x00, 0xe0, 0xdd, 0x3d, 0xa7, 0x47, - 0x7a, 0x9a, 0x53, 0xb3, 0x8e, 0x6e, 0xf4, 0x14, 0x29, 0xc9, - 0xa6, 0x46, 0x7b, 0x9b, 0x01, 0xe1, 0xdc, 0x3c, 0xf5, 0x15, - 0x28, 0xc8, 0x52, 0xb2, 0x8f, 0x6f, 0x51, 0xb1, 0x8c, 0x6c, - 0xf6, 0x16, 0x2b, 0xcb, 0x02, 0xe2, 0xdf, 0x3f, 0xa5, 0x45, - 0x78, 0x98, 0xf7, 0x17, 0x2a, 0xca, 0x50, 0xb0, 0x8d, 0x6d, - 0xa4, 0x44, 0x79, 0x99, 0x03, 0xe3, 0xde, 0x3e, 0xa2, 0x42, - 0x7f, 0x9f, 0x05, 0xe5, 0xd8, 0x38, 0xf1, 0x11, 0x2c, 0xcc, - 0x56, 0xb6, 0x8b, 0x6b, 0x04, 0xe4, 0xd9, 0x39, 0xa3, 0x43, - 0x7e, 0x9e, 0x57, 0xb7, 0x8a, 0x6a, 0xf0, 0x10, 0x2d, 0xcd, - 0xf3, 0x13, 0x2e, 0xce, 0x54, 0xb4, 0x89, 0x69, 0xa0, 0x40, - 0x7d, 0x9d, 0x07, 0xe7, 0xda, 0x3a, 0x55, 0xb5, 0x88, 0x68, - 0xf2, 0x12, 0x2f, 0xcf, 0x06, 0xe6, 0xdb, 0x3b, 0xa1, 0x41, - 0x7c, 0x9c, 0x59, 0xb9, 0x84, 0x64, 0xfe, 0x1e, 0x23, 0xc3, - 0x0a, 0xea, 0xd7, 0x37, 0xad, 0x4d, 0x70, 0x90, 0xff, 0x1f, - 0x22, 0xc2, 0x58, 0xb8, 0x85, 0x65, 0xac, 0x4c, 0x71, 0x91, - 0x0b, 0xeb, 0xd6, 0x36, 0x08, 0xe8, 0xd5, 0x35, 0xaf, 0x4f, - 0x72, 0x92, 0x5b, 0xbb, 0x86, 0x66, 0xfc, 0x1c, 0x21, 0xc1, - 0xae, 0x4e, 0x73, 0x93, 0x09, 0xe9, 0xd4, 0x34, 0xfd, 0x1d, - 0x20, 0xc0, 0x5a, 0xba, 0x87, 0x67, 0xfb, 0x1b, 0x26, 0xc6, - 0x5c, 0xbc, 0x81, 0x61, 0xa8, 0x48, 0x75, 0x95, 0x0f, 0xef, - 0xd2, 0x32, 0x5d, 0xbd, 0x80, 0x60, 0xfa, 0x1a, 0x27, 0xc7, - 0x0e, 0xee, 0xd3, 0x33, 0xa9, 0x49, 0x74, 0x94, 0xaa, 0x4a, - 0x77, 0x97, 0x0d, 0xed, 0xd0, 0x30, 0xf9, 0x19, 0x24, 0xc4, - 0x5e, 0xbe, 0x83, 0x63, 0x0c, 0xec, 0xd1, 0x31, 0xab, 0x4b, - 0x76, 0x96, 0x5f, 0xbf, 0x82, 0x62, 0xf8, 0x18, 0x25, 0xc5, - 0x00, 0xe1, 0xdf, 0x3e, 0xa3, 0x42, 0x7c, 0x9d, 0x5b, 0xba, - 0x84, 0x65, 0xf8, 0x19, 0x27, 0xc6, 0xb6, 0x57, 0x69, 0x88, - 0x15, 0xf4, 0xca, 0x2b, 0xed, 0x0c, 0x32, 0xd3, 0x4e, 0xaf, - 0x91, 0x70, 0x71, 0x90, 0xae, 0x4f, 0xd2, 0x33, 0x0d, 0xec, - 0x2a, 0xcb, 0xf5, 0x14, 0x89, 0x68, 0x56, 0xb7, 0xc7, 0x26, - 0x18, 0xf9, 0x64, 0x85, 0xbb, 0x5a, 0x9c, 0x7d, 0x43, 0xa2, - 0x3f, 0xde, 0xe0, 0x01, 0xe2, 0x03, 0x3d, 0xdc, 0x41, 0xa0, - 0x9e, 0x7f, 0xb9, 0x58, 0x66, 0x87, 0x1a, 0xfb, 0xc5, 0x24, - 0x54, 0xb5, 0x8b, 0x6a, 0xf7, 0x16, 0x28, 0xc9, 0x0f, 0xee, - 0xd0, 0x31, 0xac, 0x4d, 0x73, 0x92, 0x93, 0x72, 0x4c, 0xad, - 0x30, 0xd1, 0xef, 0x0e, 0xc8, 0x29, 0x17, 0xf6, 0x6b, 0x8a, - 0xb4, 0x55, 0x25, 0xc4, 0xfa, 0x1b, 0x86, 0x67, 0x59, 0xb8, - 0x7e, 0x9f, 0xa1, 0x40, 0xdd, 0x3c, 0x02, 0xe3, 0xd9, 0x38, - 0x06, 0xe7, 0x7a, 0x9b, 0xa5, 0x44, 0x82, 0x63, 0x5d, 0xbc, - 0x21, 0xc0, 0xfe, 0x1f, 0x6f, 0x8e, 0xb0, 0x51, 0xcc, 0x2d, - 0x13, 0xf2, 0x34, 0xd5, 0xeb, 0x0a, 0x97, 0x76, 0x48, 0xa9, - 0xa8, 0x49, 0x77, 0x96, 0x0b, 0xea, 0xd4, 0x35, 0xf3, 0x12, - 0x2c, 0xcd, 0x50, 0xb1, 0x8f, 0x6e, 0x1e, 0xff, 0xc1, 0x20, - 0xbd, 0x5c, 0x62, 0x83, 0x45, 0xa4, 0x9a, 0x7b, 0xe6, 0x07, - 0x39, 0xd8, 0x3b, 0xda, 0xe4, 0x05, 0x98, 0x79, 0x47, 0xa6, - 0x60, 0x81, 0xbf, 0x5e, 0xc3, 0x22, 0x1c, 0xfd, 0x8d, 0x6c, - 0x52, 0xb3, 0x2e, 0xcf, 0xf1, 0x10, 0xd6, 0x37, 0x09, 0xe8, - 0x75, 0x94, 0xaa, 0x4b, 0x4a, 0xab, 0x95, 0x74, 0xe9, 0x08, - 0x36, 0xd7, 0x11, 0xf0, 0xce, 0x2f, 0xb2, 0x53, 0x6d, 0x8c, - 0xfc, 0x1d, 0x23, 0xc2, 0x5f, 0xbe, 0x80, 0x61, 0xa7, 0x46, - 0x78, 0x99, 0x04, 0xe5, 0xdb, 0x3a, 0x00, 0xe2, 0xd9, 0x3b, - 0xaf, 0x4d, 0x76, 0x94, 0x43, 0xa1, 0x9a, 0x78, 0xec, 0x0e, - 0x35, 0xd7, 0x86, 0x64, 0x5f, 0xbd, 0x29, 0xcb, 0xf0, 0x12, - 0xc5, 0x27, 0x1c, 0xfe, 0x6a, 0x88, 0xb3, 0x51, 0x11, 0xf3, - 0xc8, 0x2a, 0xbe, 0x5c, 0x67, 0x85, 0x52, 0xb0, 0x8b, 0x69, - 0xfd, 0x1f, 0x24, 0xc6, 0x97, 0x75, 0x4e, 0xac, 0x38, 0xda, - 0xe1, 0x03, 0xd4, 0x36, 0x0d, 0xef, 0x7b, 0x99, 0xa2, 0x40, - 0x22, 0xc0, 0xfb, 0x19, 0x8d, 0x6f, 0x54, 0xb6, 0x61, 0x83, - 0xb8, 0x5a, 0xce, 0x2c, 0x17, 0xf5, 0xa4, 0x46, 0x7d, 0x9f, - 0x0b, 0xe9, 0xd2, 0x30, 0xe7, 0x05, 0x3e, 0xdc, 0x48, 0xaa, - 0x91, 0x73, 0x33, 0xd1, 0xea, 0x08, 0x9c, 0x7e, 0x45, 0xa7, - 0x70, 0x92, 0xa9, 0x4b, 0xdf, 0x3d, 0x06, 0xe4, 0xb5, 0x57, - 0x6c, 0x8e, 0x1a, 0xf8, 0xc3, 0x21, 0xf6, 0x14, 0x2f, 0xcd, - 0x59, 0xbb, 0x80, 0x62, 0x44, 0xa6, 0x9d, 0x7f, 0xeb, 0x09, - 0x32, 0xd0, 0x07, 0xe5, 0xde, 0x3c, 0xa8, 0x4a, 0x71, 0x93, - 0xc2, 0x20, 0x1b, 0xf9, 0x6d, 0x8f, 0xb4, 0x56, 0x81, 0x63, - 0x58, 0xba, 0x2e, 0xcc, 0xf7, 0x15, 0x55, 0xb7, 0x8c, 0x6e, - 0xfa, 0x18, 0x23, 0xc1, 0x16, 0xf4, 0xcf, 0x2d, 0xb9, 0x5b, - 0x60, 0x82, 0xd3, 0x31, 0x0a, 0xe8, 0x7c, 0x9e, 0xa5, 0x47, - 0x90, 0x72, 0x49, 0xab, 0x3f, 0xdd, 0xe6, 0x04, 0x66, 0x84, - 0xbf, 0x5d, 0xc9, 0x2b, 0x10, 0xf2, 0x25, 0xc7, 0xfc, 0x1e, - 0x8a, 0x68, 0x53, 0xb1, 0xe0, 0x02, 0x39, 0xdb, 0x4f, 0xad, - 0x96, 0x74, 0xa3, 0x41, 0x7a, 0x98, 0x0c, 0xee, 0xd5, 0x37, - 0x77, 0x95, 0xae, 0x4c, 0xd8, 0x3a, 0x01, 0xe3, 0x34, 0xd6, - 0xed, 0x0f, 0x9b, 0x79, 0x42, 0xa0, 0xf1, 0x13, 0x28, 0xca, - 0x5e, 0xbc, 0x87, 0x65, 0xb2, 0x50, 0x6b, 0x89, 0x1d, 0xff, - 0xc4, 0x26, 0x00, 0xe3, 0xdb, 0x38, 0xab, 0x48, 0x70, 0x93, - 0x4b, 0xa8, 0x90, 0x73, 0xe0, 0x03, 0x3b, 0xd8, 0x96, 0x75, - 0x4d, 0xae, 0x3d, 0xde, 0xe6, 0x05, 0xdd, 0x3e, 0x06, 0xe5, - 0x76, 0x95, 0xad, 0x4e, 0x31, 0xd2, 0xea, 0x09, 0x9a, 0x79, - 0x41, 0xa2, 0x7a, 0x99, 0xa1, 0x42, 0xd1, 0x32, 0x0a, 0xe9, - 0xa7, 0x44, 0x7c, 0x9f, 0x0c, 0xef, 0xd7, 0x34, 0xec, 0x0f, - 0x37, 0xd4, 0x47, 0xa4, 0x9c, 0x7f, 0x62, 0x81, 0xb9, 0x5a, - 0xc9, 0x2a, 0x12, 0xf1, 0x29, 0xca, 0xf2, 0x11, 0x82, 0x61, - 0x59, 0xba, 0xf4, 0x17, 0x2f, 0xcc, 0x5f, 0xbc, 0x84, 0x67, - 0xbf, 0x5c, 0x64, 0x87, 0x14, 0xf7, 0xcf, 0x2c, 0x53, 0xb0, - 0x88, 0x6b, 0xf8, 0x1b, 0x23, 0xc0, 0x18, 0xfb, 0xc3, 0x20, - 0xb3, 0x50, 0x68, 0x8b, 0xc5, 0x26, 0x1e, 0xfd, 0x6e, 0x8d, - 0xb5, 0x56, 0x8e, 0x6d, 0x55, 0xb6, 0x25, 0xc6, 0xfe, 0x1d, - 0xc4, 0x27, 0x1f, 0xfc, 0x6f, 0x8c, 0xb4, 0x57, 0x8f, 0x6c, - 0x54, 0xb7, 0x24, 0xc7, 0xff, 0x1c, 0x52, 0xb1, 0x89, 0x6a, - 0xf9, 0x1a, 0x22, 0xc1, 0x19, 0xfa, 0xc2, 0x21, 0xb2, 0x51, - 0x69, 0x8a, 0xf5, 0x16, 0x2e, 0xcd, 0x5e, 0xbd, 0x85, 0x66, - 0xbe, 0x5d, 0x65, 0x86, 0x15, 0xf6, 0xce, 0x2d, 0x63, 0x80, - 0xb8, 0x5b, 0xc8, 0x2b, 0x13, 0xf0, 0x28, 0xcb, 0xf3, 0x10, - 0x83, 0x60, 0x58, 0xbb, 0xa6, 0x45, 0x7d, 0x9e, 0x0d, 0xee, - 0xd6, 0x35, 0xed, 0x0e, 0x36, 0xd5, 0x46, 0xa5, 0x9d, 0x7e, - 0x30, 0xd3, 0xeb, 0x08, 0x9b, 0x78, 0x40, 0xa3, 0x7b, 0x98, - 0xa0, 0x43, 0xd0, 0x33, 0x0b, 0xe8, 0x97, 0x74, 0x4c, 0xaf, - 0x3c, 0xdf, 0xe7, 0x04, 0xdc, 0x3f, 0x07, 0xe4, 0x77, 0x94, - 0xac, 0x4f, 0x01, 0xe2, 0xda, 0x39, 0xaa, 0x49, 0x71, 0x92, - 0x4a, 0xa9, 0x91, 0x72, 0xe1, 0x02, 0x3a, 0xd9, 0x00, 0xe4, - 0xd5, 0x31, 0xb7, 0x53, 0x62, 0x86, 0x73, 0x97, 0xa6, 0x42, - 0xc4, 0x20, 0x11, 0xf5, 0xe6, 0x02, 0x33, 0xd7, 0x51, 0xb5, - 0x84, 0x60, 0x95, 0x71, 0x40, 0xa4, 0x22, 0xc6, 0xf7, 0x13, - 0xd1, 0x35, 0x04, 0xe0, 0x66, 0x82, 0xb3, 0x57, 0xa2, 0x46, - 0x77, 0x93, 0x15, 0xf1, 0xc0, 0x24, 0x37, 0xd3, 0xe2, 0x06, - 0x80, 0x64, 0x55, 0xb1, 0x44, 0xa0, 0x91, 0x75, 0xf3, 0x17, - 0x26, 0xc2, 0xbf, 0x5b, 0x6a, 0x8e, 0x08, 0xec, 0xdd, 0x39, - 0xcc, 0x28, 0x19, 0xfd, 0x7b, 0x9f, 0xae, 0x4a, 0x59, 0xbd, - 0x8c, 0x68, 0xee, 0x0a, 0x3b, 0xdf, 0x2a, 0xce, 0xff, 0x1b, - 0x9d, 0x79, 0x48, 0xac, 0x6e, 0x8a, 0xbb, 0x5f, 0xd9, 0x3d, - 0x0c, 0xe8, 0x1d, 0xf9, 0xc8, 0x2c, 0xaa, 0x4e, 0x7f, 0x9b, - 0x88, 0x6c, 0x5d, 0xb9, 0x3f, 0xdb, 0xea, 0x0e, 0xfb, 0x1f, - 0x2e, 0xca, 0x4c, 0xa8, 0x99, 0x7d, 0x63, 0x87, 0xb6, 0x52, - 0xd4, 0x30, 0x01, 0xe5, 0x10, 0xf4, 0xc5, 0x21, 0xa7, 0x43, - 0x72, 0x96, 0x85, 0x61, 0x50, 0xb4, 0x32, 0xd6, 0xe7, 0x03, - 0xf6, 0x12, 0x23, 0xc7, 0x41, 0xa5, 0x94, 0x70, 0xb2, 0x56, - 0x67, 0x83, 0x05, 0xe1, 0xd0, 0x34, 0xc1, 0x25, 0x14, 0xf0, - 0x76, 0x92, 0xa3, 0x47, 0x54, 0xb0, 0x81, 0x65, 0xe3, 0x07, - 0x36, 0xd2, 0x27, 0xc3, 0xf2, 0x16, 0x90, 0x74, 0x45, 0xa1, - 0xdc, 0x38, 0x09, 0xed, 0x6b, 0x8f, 0xbe, 0x5a, 0xaf, 0x4b, - 0x7a, 0x9e, 0x18, 0xfc, 0xcd, 0x29, 0x3a, 0xde, 0xef, 0x0b, - 0x8d, 0x69, 0x58, 0xbc, 0x49, 0xad, 0x9c, 0x78, 0xfe, 0x1a, - 0x2b, 0xcf, 0x0d, 0xe9, 0xd8, 0x3c, 0xba, 0x5e, 0x6f, 0x8b, - 0x7e, 0x9a, 0xab, 0x4f, 0xc9, 0x2d, 0x1c, 0xf8, 0xeb, 0x0f, - 0x3e, 0xda, 0x5c, 0xb8, 0x89, 0x6d, 0x98, 0x7c, 0x4d, 0xa9, - 0x2f, 0xcb, 0xfa, 0x1e, 0x00, 0xe5, 0xd7, 0x32, 0xb3, 0x56, - 0x64, 0x81, 0x7b, 0x9e, 0xac, 0x49, 0xc8, 0x2d, 0x1f, 0xfa, - 0xf6, 0x13, 0x21, 0xc4, 0x45, 0xa0, 0x92, 0x77, 0x8d, 0x68, - 0x5a, 0xbf, 0x3e, 0xdb, 0xe9, 0x0c, 0xf1, 0x14, 0x26, 0xc3, - 0x42, 0xa7, 0x95, 0x70, 0x8a, 0x6f, 0x5d, 0xb8, 0x39, 0xdc, - 0xee, 0x0b, 0x07, 0xe2, 0xd0, 0x35, 0xb4, 0x51, 0x63, 0x86, - 0x7c, 0x99, 0xab, 0x4e, 0xcf, 0x2a, 0x18, 0xfd, 0xff, 0x1a, - 0x28, 0xcd, 0x4c, 0xa9, 0x9b, 0x7e, 0x84, 0x61, 0x53, 0xb6, - 0x37, 0xd2, 0xe0, 0x05, 0x09, 0xec, 0xde, 0x3b, 0xba, 0x5f, - 0x6d, 0x88, 0x72, 0x97, 0xa5, 0x40, 0xc1, 0x24, 0x16, 0xf3, - 0x0e, 0xeb, 0xd9, 0x3c, 0xbd, 0x58, 0x6a, 0x8f, 0x75, 0x90, - 0xa2, 0x47, 0xc6, 0x23, 0x11, 0xf4, 0xf8, 0x1d, 0x2f, 0xca, - 0x4b, 0xae, 0x9c, 0x79, 0x83, 0x66, 0x54, 0xb1, 0x30, 0xd5, - 0xe7, 0x02, 0xe3, 0x06, 0x34, 0xd1, 0x50, 0xb5, 0x87, 0x62, - 0x98, 0x7d, 0x4f, 0xaa, 0x2b, 0xce, 0xfc, 0x19, 0x15, 0xf0, - 0xc2, 0x27, 0xa6, 0x43, 0x71, 0x94, 0x6e, 0x8b, 0xb9, 0x5c, - 0xdd, 0x38, 0x0a, 0xef, 0x12, 0xf7, 0xc5, 0x20, 0xa1, 0x44, - 0x76, 0x93, 0x69, 0x8c, 0xbe, 0x5b, 0xda, 0x3f, 0x0d, 0xe8, - 0xe4, 0x01, 0x33, 0xd6, 0x57, 0xb2, 0x80, 0x65, 0x9f, 0x7a, - 0x48, 0xad, 0x2c, 0xc9, 0xfb, 0x1e, 0x1c, 0xf9, 0xcb, 0x2e, - 0xaf, 0x4a, 0x78, 0x9d, 0x67, 0x82, 0xb0, 0x55, 0xd4, 0x31, - 0x03, 0xe6, 0xea, 0x0f, 0x3d, 0xd8, 0x59, 0xbc, 0x8e, 0x6b, - 0x91, 0x74, 0x46, 0xa3, 0x22, 0xc7, 0xf5, 0x10, 0xed, 0x08, - 0x3a, 0xdf, 0x5e, 0xbb, 0x89, 0x6c, 0x96, 0x73, 0x41, 0xa4, - 0x25, 0xc0, 0xf2, 0x17, 0x1b, 0xfe, 0xcc, 0x29, 0xa8, 0x4d, - 0x7f, 0x9a, 0x60, 0x85, 0xb7, 0x52, 0xd3, 0x36, 0x04, 0xe1, - 0x00, 0xe6, 0xd1, 0x37, 0xbf, 0x59, 0x6e, 0x88, 0x63, 0x85, - 0xb2, 0x54, 0xdc, 0x3a, 0x0d, 0xeb, 0xc6, 0x20, 0x17, 0xf1, - 0x79, 0x9f, 0xa8, 0x4e, 0xa5, 0x43, 0x74, 0x92, 0x1a, 0xfc, - 0xcb, 0x2d, 0x91, 0x77, 0x40, 0xa6, 0x2e, 0xc8, 0xff, 0x19, - 0xf2, 0x14, 0x23, 0xc5, 0x4d, 0xab, 0x9c, 0x7a, 0x57, 0xb1, - 0x86, 0x60, 0xe8, 0x0e, 0x39, 0xdf, 0x34, 0xd2, 0xe5, 0x03, - 0x8b, 0x6d, 0x5a, 0xbc, 0x3f, 0xd9, 0xee, 0x08, 0x80, 0x66, - 0x51, 0xb7, 0x5c, 0xba, 0x8d, 0x6b, 0xe3, 0x05, 0x32, 0xd4, - 0xf9, 0x1f, 0x28, 0xce, 0x46, 0xa0, 0x97, 0x71, 0x9a, 0x7c, - 0x4b, 0xad, 0x25, 0xc3, 0xf4, 0x12, 0xae, 0x48, 0x7f, 0x99, - 0x11, 0xf7, 0xc0, 0x26, 0xcd, 0x2b, 0x1c, 0xfa, 0x72, 0x94, - 0xa3, 0x45, 0x68, 0x8e, 0xb9, 0x5f, 0xd7, 0x31, 0x06, 0xe0, - 0x0b, 0xed, 0xda, 0x3c, 0xb4, 0x52, 0x65, 0x83, 0x7e, 0x98, - 0xaf, 0x49, 0xc1, 0x27, 0x10, 0xf6, 0x1d, 0xfb, 0xcc, 0x2a, - 0xa2, 0x44, 0x73, 0x95, 0xb8, 0x5e, 0x69, 0x8f, 0x07, 0xe1, - 0xd6, 0x30, 0xdb, 0x3d, 0x0a, 0xec, 0x64, 0x82, 0xb5, 0x53, - 0xef, 0x09, 0x3e, 0xd8, 0x50, 0xb6, 0x81, 0x67, 0x8c, 0x6a, - 0x5d, 0xbb, 0x33, 0xd5, 0xe2, 0x04, 0x29, 0xcf, 0xf8, 0x1e, - 0x96, 0x70, 0x47, 0xa1, 0x4a, 0xac, 0x9b, 0x7d, 0xf5, 0x13, - 0x24, 0xc2, 0x41, 0xa7, 0x90, 0x76, 0xfe, 0x18, 0x2f, 0xc9, - 0x22, 0xc4, 0xf3, 0x15, 0x9d, 0x7b, 0x4c, 0xaa, 0x87, 0x61, - 0x56, 0xb0, 0x38, 0xde, 0xe9, 0x0f, 0xe4, 0x02, 0x35, 0xd3, - 0x5b, 0xbd, 0x8a, 0x6c, 0xd0, 0x36, 0x01, 0xe7, 0x6f, 0x89, - 0xbe, 0x58, 0xb3, 0x55, 0x62, 0x84, 0x0c, 0xea, 0xdd, 0x3b, - 0x16, 0xf0, 0xc7, 0x21, 0xa9, 0x4f, 0x78, 0x9e, 0x75, 0x93, - 0xa4, 0x42, 0xca, 0x2c, 0x1b, 0xfd, 0x00, 0xe7, 0xd3, 0x34, - 0xbb, 0x5c, 0x68, 0x8f, 0x6b, 0x8c, 0xb8, 0x5f, 0xd0, 0x37, - 0x03, 0xe4, 0xd6, 0x31, 0x05, 0xe2, 0x6d, 0x8a, 0xbe, 0x59, - 0xbd, 0x5a, 0x6e, 0x89, 0x06, 0xe1, 0xd5, 0x32, 0xb1, 0x56, - 0x62, 0x85, 0x0a, 0xed, 0xd9, 0x3e, 0xda, 0x3d, 0x09, 0xee, - 0x61, 0x86, 0xb2, 0x55, 0x67, 0x80, 0xb4, 0x53, 0xdc, 0x3b, - 0x0f, 0xe8, 0x0c, 0xeb, 0xdf, 0x38, 0xb7, 0x50, 0x64, 0x83, - 0x7f, 0x98, 0xac, 0x4b, 0xc4, 0x23, 0x17, 0xf0, 0x14, 0xf3, - 0xc7, 0x20, 0xaf, 0x48, 0x7c, 0x9b, 0xa9, 0x4e, 0x7a, 0x9d, - 0x12, 0xf5, 0xc1, 0x26, 0xc2, 0x25, 0x11, 0xf6, 0x79, 0x9e, - 0xaa, 0x4d, 0xce, 0x29, 0x1d, 0xfa, 0x75, 0x92, 0xa6, 0x41, - 0xa5, 0x42, 0x76, 0x91, 0x1e, 0xf9, 0xcd, 0x2a, 0x18, 0xff, - 0xcb, 0x2c, 0xa3, 0x44, 0x70, 0x97, 0x73, 0x94, 0xa0, 0x47, - 0xc8, 0x2f, 0x1b, 0xfc, 0xfe, 0x19, 0x2d, 0xca, 0x45, 0xa2, - 0x96, 0x71, 0x95, 0x72, 0x46, 0xa1, 0x2e, 0xc9, 0xfd, 0x1a, - 0x28, 0xcf, 0xfb, 0x1c, 0x93, 0x74, 0x40, 0xa7, 0x43, 0xa4, - 0x90, 0x77, 0xf8, 0x1f, 0x2b, 0xcc, 0x4f, 0xa8, 0x9c, 0x7b, - 0xf4, 0x13, 0x27, 0xc0, 0x24, 0xc3, 0xf7, 0x10, 0x9f, 0x78, - 0x4c, 0xab, 0x99, 0x7e, 0x4a, 0xad, 0x22, 0xc5, 0xf1, 0x16, - 0xf2, 0x15, 0x21, 0xc6, 0x49, 0xae, 0x9a, 0x7d, 0x81, 0x66, - 0x52, 0xb5, 0x3a, 0xdd, 0xe9, 0x0e, 0xea, 0x0d, 0x39, 0xde, - 0x51, 0xb6, 0x82, 0x65, 0x57, 0xb0, 0x84, 0x63, 0xec, 0x0b, - 0x3f, 0xd8, 0x3c, 0xdb, 0xef, 0x08, 0x87, 0x60, 0x54, 0xb3, - 0x30, 0xd7, 0xe3, 0x04, 0x8b, 0x6c, 0x58, 0xbf, 0x5b, 0xbc, - 0x88, 0x6f, 0xe0, 0x07, 0x33, 0xd4, 0xe6, 0x01, 0x35, 0xd2, - 0x5d, 0xba, 0x8e, 0x69, 0x8d, 0x6a, 0x5e, 0xb9, 0x36, 0xd1, - 0xe5, 0x02, 0x00, 0xe8, 0xcd, 0x25, 0x87, 0x6f, 0x4a, 0xa2, - 0x13, 0xfb, 0xde, 0x36, 0x94, 0x7c, 0x59, 0xb1, 0x26, 0xce, - 0xeb, 0x03, 0xa1, 0x49, 0x6c, 0x84, 0x35, 0xdd, 0xf8, 0x10, - 0xb2, 0x5a, 0x7f, 0x97, 0x4c, 0xa4, 0x81, 0x69, 0xcb, 0x23, - 0x06, 0xee, 0x5f, 0xb7, 0x92, 0x7a, 0xd8, 0x30, 0x15, 0xfd, - 0x6a, 0x82, 0xa7, 0x4f, 0xed, 0x05, 0x20, 0xc8, 0x79, 0x91, - 0xb4, 0x5c, 0xfe, 0x16, 0x33, 0xdb, 0x98, 0x70, 0x55, 0xbd, - 0x1f, 0xf7, 0xd2, 0x3a, 0x8b, 0x63, 0x46, 0xae, 0x0c, 0xe4, - 0xc1, 0x29, 0xbe, 0x56, 0x73, 0x9b, 0x39, 0xd1, 0xf4, 0x1c, - 0xad, 0x45, 0x60, 0x88, 0x2a, 0xc2, 0xe7, 0x0f, 0xd4, 0x3c, - 0x19, 0xf1, 0x53, 0xbb, 0x9e, 0x76, 0xc7, 0x2f, 0x0a, 0xe2, - 0x40, 0xa8, 0x8d, 0x65, 0xf2, 0x1a, 0x3f, 0xd7, 0x75, 0x9d, - 0xb8, 0x50, 0xe1, 0x09, 0x2c, 0xc4, 0x66, 0x8e, 0xab, 0x43, - 0x2d, 0xc5, 0xe0, 0x08, 0xaa, 0x42, 0x67, 0x8f, 0x3e, 0xd6, - 0xf3, 0x1b, 0xb9, 0x51, 0x74, 0x9c, 0x0b, 0xe3, 0xc6, 0x2e, - 0x8c, 0x64, 0x41, 0xa9, 0x18, 0xf0, 0xd5, 0x3d, 0x9f, 0x77, - 0x52, 0xba, 0x61, 0x89, 0xac, 0x44, 0xe6, 0x0e, 0x2b, 0xc3, - 0x72, 0x9a, 0xbf, 0x57, 0xf5, 0x1d, 0x38, 0xd0, 0x47, 0xaf, - 0x8a, 0x62, 0xc0, 0x28, 0x0d, 0xe5, 0x54, 0xbc, 0x99, 0x71, - 0xd3, 0x3b, 0x1e, 0xf6, 0xb5, 0x5d, 0x78, 0x90, 0x32, 0xda, - 0xff, 0x17, 0xa6, 0x4e, 0x6b, 0x83, 0x21, 0xc9, 0xec, 0x04, - 0x93, 0x7b, 0x5e, 0xb6, 0x14, 0xfc, 0xd9, 0x31, 0x80, 0x68, - 0x4d, 0xa5, 0x07, 0xef, 0xca, 0x22, 0xf9, 0x11, 0x34, 0xdc, - 0x7e, 0x96, 0xb3, 0x5b, 0xea, 0x02, 0x27, 0xcf, 0x6d, 0x85, - 0xa0, 0x48, 0xdf, 0x37, 0x12, 0xfa, 0x58, 0xb0, 0x95, 0x7d, - 0xcc, 0x24, 0x01, 0xe9, 0x4b, 0xa3, 0x86, 0x6e, 0x00, 0xe9, - 0xcf, 0x26, 0x83, 0x6a, 0x4c, 0xa5, 0x1b, 0xf2, 0xd4, 0x3d, - 0x98, 0x71, 0x57, 0xbe, 0x36, 0xdf, 0xf9, 0x10, 0xb5, 0x5c, - 0x7a, 0x93, 0x2d, 0xc4, 0xe2, 0x0b, 0xae, 0x47, 0x61, 0x88, - 0x6c, 0x85, 0xa3, 0x4a, 0xef, 0x06, 0x20, 0xc9, 0x77, 0x9e, - 0xb8, 0x51, 0xf4, 0x1d, 0x3b, 0xd2, 0x5a, 0xb3, 0x95, 0x7c, - 0xd9, 0x30, 0x16, 0xff, 0x41, 0xa8, 0x8e, 0x67, 0xc2, 0x2b, - 0x0d, 0xe4, 0xd8, 0x31, 0x17, 0xfe, 0x5b, 0xb2, 0x94, 0x7d, - 0xc3, 0x2a, 0x0c, 0xe5, 0x40, 0xa9, 0x8f, 0x66, 0xee, 0x07, - 0x21, 0xc8, 0x6d, 0x84, 0xa2, 0x4b, 0xf5, 0x1c, 0x3a, 0xd3, - 0x76, 0x9f, 0xb9, 0x50, 0xb4, 0x5d, 0x7b, 0x92, 0x37, 0xde, - 0xf8, 0x11, 0xaf, 0x46, 0x60, 0x89, 0x2c, 0xc5, 0xe3, 0x0a, - 0x82, 0x6b, 0x4d, 0xa4, 0x01, 0xe8, 0xce, 0x27, 0x99, 0x70, - 0x56, 0xbf, 0x1a, 0xf3, 0xd5, 0x3c, 0xad, 0x44, 0x62, 0x8b, - 0x2e, 0xc7, 0xe1, 0x08, 0xb6, 0x5f, 0x79, 0x90, 0x35, 0xdc, - 0xfa, 0x13, 0x9b, 0x72, 0x54, 0xbd, 0x18, 0xf1, 0xd7, 0x3e, - 0x80, 0x69, 0x4f, 0xa6, 0x03, 0xea, 0xcc, 0x25, 0xc1, 0x28, - 0x0e, 0xe7, 0x42, 0xab, 0x8d, 0x64, 0xda, 0x33, 0x15, 0xfc, - 0x59, 0xb0, 0x96, 0x7f, 0xf7, 0x1e, 0x38, 0xd1, 0x74, 0x9d, - 0xbb, 0x52, 0xec, 0x05, 0x23, 0xca, 0x6f, 0x86, 0xa0, 0x49, - 0x75, 0x9c, 0xba, 0x53, 0xf6, 0x1f, 0x39, 0xd0, 0x6e, 0x87, - 0xa1, 0x48, 0xed, 0x04, 0x22, 0xcb, 0x43, 0xaa, 0x8c, 0x65, - 0xc0, 0x29, 0x0f, 0xe6, 0x58, 0xb1, 0x97, 0x7e, 0xdb, 0x32, - 0x14, 0xfd, 0x19, 0xf0, 0xd6, 0x3f, 0x9a, 0x73, 0x55, 0xbc, - 0x02, 0xeb, 0xcd, 0x24, 0x81, 0x68, 0x4e, 0xa7, 0x2f, 0xc6, - 0xe0, 0x09, 0xac, 0x45, 0x63, 0x8a, 0x34, 0xdd, 0xfb, 0x12, - 0xb7, 0x5e, 0x78, 0x91, 0x00, 0xea, 0xc9, 0x23, 0x8f, 0x65, - 0x46, 0xac, 0x03, 0xe9, 0xca, 0x20, 0x8c, 0x66, 0x45, 0xaf, - 0x06, 0xec, 0xcf, 0x25, 0x89, 0x63, 0x40, 0xaa, 0x05, 0xef, - 0xcc, 0x26, 0x8a, 0x60, 0x43, 0xa9, 0x0c, 0xe6, 0xc5, 0x2f, - 0x83, 0x69, 0x4a, 0xa0, 0x0f, 0xe5, 0xc6, 0x2c, 0x80, 0x6a, - 0x49, 0xa3, 0x0a, 0xe0, 0xc3, 0x29, 0x85, 0x6f, 0x4c, 0xa6, - 0x09, 0xe3, 0xc0, 0x2a, 0x86, 0x6c, 0x4f, 0xa5, 0x18, 0xf2, - 0xd1, 0x3b, 0x97, 0x7d, 0x5e, 0xb4, 0x1b, 0xf1, 0xd2, 0x38, - 0x94, 0x7e, 0x5d, 0xb7, 0x1e, 0xf4, 0xd7, 0x3d, 0x91, 0x7b, - 0x58, 0xb2, 0x1d, 0xf7, 0xd4, 0x3e, 0x92, 0x78, 0x5b, 0xb1, - 0x14, 0xfe, 0xdd, 0x37, 0x9b, 0x71, 0x52, 0xb8, 0x17, 0xfd, - 0xde, 0x34, 0x98, 0x72, 0x51, 0xbb, 0x12, 0xf8, 0xdb, 0x31, - 0x9d, 0x77, 0x54, 0xbe, 0x11, 0xfb, 0xd8, 0x32, 0x9e, 0x74, - 0x57, 0xbd, 0x30, 0xda, 0xf9, 0x13, 0xbf, 0x55, 0x76, 0x9c, - 0x33, 0xd9, 0xfa, 0x10, 0xbc, 0x56, 0x75, 0x9f, 0x36, 0xdc, - 0xff, 0x15, 0xb9, 0x53, 0x70, 0x9a, 0x35, 0xdf, 0xfc, 0x16, - 0xba, 0x50, 0x73, 0x99, 0x3c, 0xd6, 0xf5, 0x1f, 0xb3, 0x59, - 0x7a, 0x90, 0x3f, 0xd5, 0xf6, 0x1c, 0xb0, 0x5a, 0x79, 0x93, - 0x3a, 0xd0, 0xf3, 0x19, 0xb5, 0x5f, 0x7c, 0x96, 0x39, 0xd3, - 0xf0, 0x1a, 0xb6, 0x5c, 0x7f, 0x95, 0x28, 0xc2, 0xe1, 0x0b, - 0xa7, 0x4d, 0x6e, 0x84, 0x2b, 0xc1, 0xe2, 0x08, 0xa4, 0x4e, - 0x6d, 0x87, 0x2e, 0xc4, 0xe7, 0x0d, 0xa1, 0x4b, 0x68, 0x82, - 0x2d, 0xc7, 0xe4, 0x0e, 0xa2, 0x48, 0x6b, 0x81, 0x24, 0xce, - 0xed, 0x07, 0xab, 0x41, 0x62, 0x88, 0x27, 0xcd, 0xee, 0x04, - 0xa8, 0x42, 0x61, 0x8b, 0x22, 0xc8, 0xeb, 0x01, 0xad, 0x47, - 0x64, 0x8e, 0x21, 0xcb, 0xe8, 0x02, 0xae, 0x44, 0x67, 0x8d, - 0x00, 0xeb, 0xcb, 0x20, 0x8b, 0x60, 0x40, 0xab, 0x0b, 0xe0, - 0xc0, 0x2b, 0x80, 0x6b, 0x4b, 0xa0, 0x16, 0xfd, 0xdd, 0x36, - 0x9d, 0x76, 0x56, 0xbd, 0x1d, 0xf6, 0xd6, 0x3d, 0x96, 0x7d, - 0x5d, 0xb6, 0x2c, 0xc7, 0xe7, 0x0c, 0xa7, 0x4c, 0x6c, 0x87, - 0x27, 0xcc, 0xec, 0x07, 0xac, 0x47, 0x67, 0x8c, 0x3a, 0xd1, - 0xf1, 0x1a, 0xb1, 0x5a, 0x7a, 0x91, 0x31, 0xda, 0xfa, 0x11, - 0xba, 0x51, 0x71, 0x9a, 0x58, 0xb3, 0x93, 0x78, 0xd3, 0x38, - 0x18, 0xf3, 0x53, 0xb8, 0x98, 0x73, 0xd8, 0x33, 0x13, 0xf8, - 0x4e, 0xa5, 0x85, 0x6e, 0xc5, 0x2e, 0x0e, 0xe5, 0x45, 0xae, - 0x8e, 0x65, 0xce, 0x25, 0x05, 0xee, 0x74, 0x9f, 0xbf, 0x54, - 0xff, 0x14, 0x34, 0xdf, 0x7f, 0x94, 0xb4, 0x5f, 0xf4, 0x1f, - 0x3f, 0xd4, 0x62, 0x89, 0xa9, 0x42, 0xe9, 0x02, 0x22, 0xc9, - 0x69, 0x82, 0xa2, 0x49, 0xe2, 0x09, 0x29, 0xc2, 0xb0, 0x5b, - 0x7b, 0x90, 0x3b, 0xd0, 0xf0, 0x1b, 0xbb, 0x50, 0x70, 0x9b, - 0x30, 0xdb, 0xfb, 0x10, 0xa6, 0x4d, 0x6d, 0x86, 0x2d, 0xc6, - 0xe6, 0x0d, 0xad, 0x46, 0x66, 0x8d, 0x26, 0xcd, 0xed, 0x06, - 0x9c, 0x77, 0x57, 0xbc, 0x17, 0xfc, 0xdc, 0x37, 0x97, 0x7c, - 0x5c, 0xb7, 0x1c, 0xf7, 0xd7, 0x3c, 0x8a, 0x61, 0x41, 0xaa, - 0x01, 0xea, 0xca, 0x21, 0x81, 0x6a, 0x4a, 0xa1, 0x0a, 0xe1, - 0xc1, 0x2a, 0xe8, 0x03, 0x23, 0xc8, 0x63, 0x88, 0xa8, 0x43, - 0xe3, 0x08, 0x28, 0xc3, 0x68, 0x83, 0xa3, 0x48, 0xfe, 0x15, - 0x35, 0xde, 0x75, 0x9e, 0xbe, 0x55, 0xf5, 0x1e, 0x3e, 0xd5, - 0x7e, 0x95, 0xb5, 0x5e, 0xc4, 0x2f, 0x0f, 0xe4, 0x4f, 0xa4, - 0x84, 0x6f, 0xcf, 0x24, 0x04, 0xef, 0x44, 0xaf, 0x8f, 0x64, - 0xd2, 0x39, 0x19, 0xf2, 0x59, 0xb2, 0x92, 0x79, 0xd9, 0x32, - 0x12, 0xf9, 0x52, 0xb9, 0x99, 0x72, 0x00, 0xec, 0xc5, 0x29, - 0x97, 0x7b, 0x52, 0xbe, 0x33, 0xdf, 0xf6, 0x1a, 0xa4, 0x48, - 0x61, 0x8d, 0x66, 0x8a, 0xa3, 0x4f, 0xf1, 0x1d, 0x34, 0xd8, - 0x55, 0xb9, 0x90, 0x7c, 0xc2, 0x2e, 0x07, 0xeb, 0xcc, 0x20, - 0x09, 0xe5, 0x5b, 0xb7, 0x9e, 0x72, 0xff, 0x13, 0x3a, 0xd6, - 0x68, 0x84, 0xad, 0x41, 0xaa, 0x46, 0x6f, 0x83, 0x3d, 0xd1, - 0xf8, 0x14, 0x99, 0x75, 0x5c, 0xb0, 0x0e, 0xe2, 0xcb, 0x27, - 0x85, 0x69, 0x40, 0xac, 0x12, 0xfe, 0xd7, 0x3b, 0xb6, 0x5a, - 0x73, 0x9f, 0x21, 0xcd, 0xe4, 0x08, 0xe3, 0x0f, 0x26, 0xca, - 0x74, 0x98, 0xb1, 0x5d, 0xd0, 0x3c, 0x15, 0xf9, 0x47, 0xab, - 0x82, 0x6e, 0x49, 0xa5, 0x8c, 0x60, 0xde, 0x32, 0x1b, 0xf7, - 0x7a, 0x96, 0xbf, 0x53, 0xed, 0x01, 0x28, 0xc4, 0x2f, 0xc3, - 0xea, 0x06, 0xb8, 0x54, 0x7d, 0x91, 0x1c, 0xf0, 0xd9, 0x35, - 0x8b, 0x67, 0x4e, 0xa2, 0x17, 0xfb, 0xd2, 0x3e, 0x80, 0x6c, - 0x45, 0xa9, 0x24, 0xc8, 0xe1, 0x0d, 0xb3, 0x5f, 0x76, 0x9a, - 0x71, 0x9d, 0xb4, 0x58, 0xe6, 0x0a, 0x23, 0xcf, 0x42, 0xae, - 0x87, 0x6b, 0xd5, 0x39, 0x10, 0xfc, 0xdb, 0x37, 0x1e, 0xf2, - 0x4c, 0xa0, 0x89, 0x65, 0xe8, 0x04, 0x2d, 0xc1, 0x7f, 0x93, - 0xba, 0x56, 0xbd, 0x51, 0x78, 0x94, 0x2a, 0xc6, 0xef, 0x03, - 0x8e, 0x62, 0x4b, 0xa7, 0x19, 0xf5, 0xdc, 0x30, 0x92, 0x7e, - 0x57, 0xbb, 0x05, 0xe9, 0xc0, 0x2c, 0xa1, 0x4d, 0x64, 0x88, - 0x36, 0xda, 0xf3, 0x1f, 0xf4, 0x18, 0x31, 0xdd, 0x63, 0x8f, - 0xa6, 0x4a, 0xc7, 0x2b, 0x02, 0xee, 0x50, 0xbc, 0x95, 0x79, - 0x5e, 0xb2, 0x9b, 0x77, 0xc9, 0x25, 0x0c, 0xe0, 0x6d, 0x81, - 0xa8, 0x44, 0xfa, 0x16, 0x3f, 0xd3, 0x38, 0xd4, 0xfd, 0x11, - 0xaf, 0x43, 0x6a, 0x86, 0x0b, 0xe7, 0xce, 0x22, 0x9c, 0x70, - 0x59, 0xb5, 0x00, 0xed, 0xc7, 0x2a, 0x93, 0x7e, 0x54, 0xb9, - 0x3b, 0xd6, 0xfc, 0x11, 0xa8, 0x45, 0x6f, 0x82, 0x76, 0x9b, - 0xb1, 0x5c, 0xe5, 0x08, 0x22, 0xcf, 0x4d, 0xa0, 0x8a, 0x67, - 0xde, 0x33, 0x19, 0xf4, 0xec, 0x01, 0x2b, 0xc6, 0x7f, 0x92, - 0xb8, 0x55, 0xd7, 0x3a, 0x10, 0xfd, 0x44, 0xa9, 0x83, 0x6e, - 0x9a, 0x77, 0x5d, 0xb0, 0x09, 0xe4, 0xce, 0x23, 0xa1, 0x4c, - 0x66, 0x8b, 0x32, 0xdf, 0xf5, 0x18, 0xc5, 0x28, 0x02, 0xef, - 0x56, 0xbb, 0x91, 0x7c, 0xfe, 0x13, 0x39, 0xd4, 0x6d, 0x80, - 0xaa, 0x47, 0xb3, 0x5e, 0x74, 0x99, 0x20, 0xcd, 0xe7, 0x0a, - 0x88, 0x65, 0x4f, 0xa2, 0x1b, 0xf6, 0xdc, 0x31, 0x29, 0xc4, - 0xee, 0x03, 0xba, 0x57, 0x7d, 0x90, 0x12, 0xff, 0xd5, 0x38, - 0x81, 0x6c, 0x46, 0xab, 0x5f, 0xb2, 0x98, 0x75, 0xcc, 0x21, - 0x0b, 0xe6, 0x64, 0x89, 0xa3, 0x4e, 0xf7, 0x1a, 0x30, 0xdd, - 0x97, 0x7a, 0x50, 0xbd, 0x04, 0xe9, 0xc3, 0x2e, 0xac, 0x41, - 0x6b, 0x86, 0x3f, 0xd2, 0xf8, 0x15, 0xe1, 0x0c, 0x26, 0xcb, - 0x72, 0x9f, 0xb5, 0x58, 0xda, 0x37, 0x1d, 0xf0, 0x49, 0xa4, - 0x8e, 0x63, 0x7b, 0x96, 0xbc, 0x51, 0xe8, 0x05, 0x2f, 0xc2, - 0x40, 0xad, 0x87, 0x6a, 0xd3, 0x3e, 0x14, 0xf9, 0x0d, 0xe0, - 0xca, 0x27, 0x9e, 0x73, 0x59, 0xb4, 0x36, 0xdb, 0xf1, 0x1c, - 0xa5, 0x48, 0x62, 0x8f, 0x52, 0xbf, 0x95, 0x78, 0xc1, 0x2c, - 0x06, 0xeb, 0x69, 0x84, 0xae, 0x43, 0xfa, 0x17, 0x3d, 0xd0, - 0x24, 0xc9, 0xe3, 0x0e, 0xb7, 0x5a, 0x70, 0x9d, 0x1f, 0xf2, - 0xd8, 0x35, 0x8c, 0x61, 0x4b, 0xa6, 0xbe, 0x53, 0x79, 0x94, - 0x2d, 0xc0, 0xea, 0x07, 0x85, 0x68, 0x42, 0xaf, 0x16, 0xfb, - 0xd1, 0x3c, 0xc8, 0x25, 0x0f, 0xe2, 0x5b, 0xb6, 0x9c, 0x71, - 0xf3, 0x1e, 0x34, 0xd9, 0x60, 0x8d, 0xa7, 0x4a, 0x00, 0xee, - 0xc1, 0x2f, 0x9f, 0x71, 0x5e, 0xb0, 0x23, 0xcd, 0xe2, 0x0c, - 0xbc, 0x52, 0x7d, 0x93, 0x46, 0xa8, 0x87, 0x69, 0xd9, 0x37, - 0x18, 0xf6, 0x65, 0x8b, 0xa4, 0x4a, 0xfa, 0x14, 0x3b, 0xd5, - 0x8c, 0x62, 0x4d, 0xa3, 0x13, 0xfd, 0xd2, 0x3c, 0xaf, 0x41, - 0x6e, 0x80, 0x30, 0xde, 0xf1, 0x1f, 0xca, 0x24, 0x0b, 0xe5, - 0x55, 0xbb, 0x94, 0x7a, 0xe9, 0x07, 0x28, 0xc6, 0x76, 0x98, - 0xb7, 0x59, 0x05, 0xeb, 0xc4, 0x2a, 0x9a, 0x74, 0x5b, 0xb5, - 0x26, 0xc8, 0xe7, 0x09, 0xb9, 0x57, 0x78, 0x96, 0x43, 0xad, - 0x82, 0x6c, 0xdc, 0x32, 0x1d, 0xf3, 0x60, 0x8e, 0xa1, 0x4f, - 0xff, 0x11, 0x3e, 0xd0, 0x89, 0x67, 0x48, 0xa6, 0x16, 0xf8, - 0xd7, 0x39, 0xaa, 0x44, 0x6b, 0x85, 0x35, 0xdb, 0xf4, 0x1a, - 0xcf, 0x21, 0x0e, 0xe0, 0x50, 0xbe, 0x91, 0x7f, 0xec, 0x02, - 0x2d, 0xc3, 0x73, 0x9d, 0xb2, 0x5c, 0x0a, 0xe4, 0xcb, 0x25, - 0x95, 0x7b, 0x54, 0xba, 0x29, 0xc7, 0xe8, 0x06, 0xb6, 0x58, - 0x77, 0x99, 0x4c, 0xa2, 0x8d, 0x63, 0xd3, 0x3d, 0x12, 0xfc, - 0x6f, 0x81, 0xae, 0x40, 0xf0, 0x1e, 0x31, 0xdf, 0x86, 0x68, - 0x47, 0xa9, 0x19, 0xf7, 0xd8, 0x36, 0xa5, 0x4b, 0x64, 0x8a, - 0x3a, 0xd4, 0xfb, 0x15, 0xc0, 0x2e, 0x01, 0xef, 0x5f, 0xb1, - 0x9e, 0x70, 0xe3, 0x0d, 0x22, 0xcc, 0x7c, 0x92, 0xbd, 0x53, - 0x0f, 0xe1, 0xce, 0x20, 0x90, 0x7e, 0x51, 0xbf, 0x2c, 0xc2, - 0xed, 0x03, 0xb3, 0x5d, 0x72, 0x9c, 0x49, 0xa7, 0x88, 0x66, - 0xd6, 0x38, 0x17, 0xf9, 0x6a, 0x84, 0xab, 0x45, 0xf5, 0x1b, - 0x34, 0xda, 0x83, 0x6d, 0x42, 0xac, 0x1c, 0xf2, 0xdd, 0x33, - 0xa0, 0x4e, 0x61, 0x8f, 0x3f, 0xd1, 0xfe, 0x10, 0xc5, 0x2b, - 0x04, 0xea, 0x5a, 0xb4, 0x9b, 0x75, 0xe6, 0x08, 0x27, 0xc9, - 0x79, 0x97, 0xb8, 0x56, 0x00, 0xef, 0xc3, 0x2c, 0x9b, 0x74, - 0x58, 0xb7, 0x2b, 0xc4, 0xe8, 0x07, 0xb0, 0x5f, 0x73, 0x9c, - 0x56, 0xb9, 0x95, 0x7a, 0xcd, 0x22, 0x0e, 0xe1, 0x7d, 0x92, - 0xbe, 0x51, 0xe6, 0x09, 0x25, 0xca, 0xac, 0x43, 0x6f, 0x80, - 0x37, 0xd8, 0xf4, 0x1b, 0x87, 0x68, 0x44, 0xab, 0x1c, 0xf3, - 0xdf, 0x30, 0xfa, 0x15, 0x39, 0xd6, 0x61, 0x8e, 0xa2, 0x4d, - 0xd1, 0x3e, 0x12, 0xfd, 0x4a, 0xa5, 0x89, 0x66, 0x45, 0xaa, - 0x86, 0x69, 0xde, 0x31, 0x1d, 0xf2, 0x6e, 0x81, 0xad, 0x42, - 0xf5, 0x1a, 0x36, 0xd9, 0x13, 0xfc, 0xd0, 0x3f, 0x88, 0x67, - 0x4b, 0xa4, 0x38, 0xd7, 0xfb, 0x14, 0xa3, 0x4c, 0x60, 0x8f, - 0xe9, 0x06, 0x2a, 0xc5, 0x72, 0x9d, 0xb1, 0x5e, 0xc2, 0x2d, - 0x01, 0xee, 0x59, 0xb6, 0x9a, 0x75, 0xbf, 0x50, 0x7c, 0x93, - 0x24, 0xcb, 0xe7, 0x08, 0x94, 0x7b, 0x57, 0xb8, 0x0f, 0xe0, - 0xcc, 0x23, 0x8a, 0x65, 0x49, 0xa6, 0x11, 0xfe, 0xd2, 0x3d, - 0xa1, 0x4e, 0x62, 0x8d, 0x3a, 0xd5, 0xf9, 0x16, 0xdc, 0x33, - 0x1f, 0xf0, 0x47, 0xa8, 0x84, 0x6b, 0xf7, 0x18, 0x34, 0xdb, - 0x6c, 0x83, 0xaf, 0x40, 0x26, 0xc9, 0xe5, 0x0a, 0xbd, 0x52, - 0x7e, 0x91, 0x0d, 0xe2, 0xce, 0x21, 0x96, 0x79, 0x55, 0xba, - 0x70, 0x9f, 0xb3, 0x5c, 0xeb, 0x04, 0x28, 0xc7, 0x5b, 0xb4, - 0x98, 0x77, 0xc0, 0x2f, 0x03, 0xec, 0xcf, 0x20, 0x0c, 0xe3, - 0x54, 0xbb, 0x97, 0x78, 0xe4, 0x0b, 0x27, 0xc8, 0x7f, 0x90, - 0xbc, 0x53, 0x99, 0x76, 0x5a, 0xb5, 0x02, 0xed, 0xc1, 0x2e, - 0xb2, 0x5d, 0x71, 0x9e, 0x29, 0xc6, 0xea, 0x05, 0x63, 0x8c, - 0xa0, 0x4f, 0xf8, 0x17, 0x3b, 0xd4, 0x48, 0xa7, 0x8b, 0x64, - 0xd3, 0x3c, 0x10, 0xff, 0x35, 0xda, 0xf6, 0x19, 0xae, 0x41, - 0x6d, 0x82, 0x1e, 0xf1, 0xdd, 0x32, 0x85, 0x6a, 0x46, 0xa9, - 0x00, 0xf0, 0xfd, 0x0d, 0xe7, 0x17, 0x1a, 0xea, 0xd3, 0x23, - 0x2e, 0xde, 0x34, 0xc4, 0xc9, 0x39, 0xbb, 0x4b, 0x46, 0xb6, - 0x5c, 0xac, 0xa1, 0x51, 0x68, 0x98, 0x95, 0x65, 0x8f, 0x7f, - 0x72, 0x82, 0x6b, 0x9b, 0x96, 0x66, 0x8c, 0x7c, 0x71, 0x81, - 0xb8, 0x48, 0x45, 0xb5, 0x5f, 0xaf, 0xa2, 0x52, 0xd0, 0x20, - 0x2d, 0xdd, 0x37, 0xc7, 0xca, 0x3a, 0x03, 0xf3, 0xfe, 0x0e, - 0xe4, 0x14, 0x19, 0xe9, 0xd6, 0x26, 0x2b, 0xdb, 0x31, 0xc1, - 0xcc, 0x3c, 0x05, 0xf5, 0xf8, 0x08, 0xe2, 0x12, 0x1f, 0xef, - 0x6d, 0x9d, 0x90, 0x60, 0x8a, 0x7a, 0x77, 0x87, 0xbe, 0x4e, - 0x43, 0xb3, 0x59, 0xa9, 0xa4, 0x54, 0xbd, 0x4d, 0x40, 0xb0, - 0x5a, 0xaa, 0xa7, 0x57, 0x6e, 0x9e, 0x93, 0x63, 0x89, 0x79, - 0x74, 0x84, 0x06, 0xf6, 0xfb, 0x0b, 0xe1, 0x11, 0x1c, 0xec, - 0xd5, 0x25, 0x28, 0xd8, 0x32, 0xc2, 0xcf, 0x3f, 0xb1, 0x41, - 0x4c, 0xbc, 0x56, 0xa6, 0xab, 0x5b, 0x62, 0x92, 0x9f, 0x6f, - 0x85, 0x75, 0x78, 0x88, 0x0a, 0xfa, 0xf7, 0x07, 0xed, 0x1d, - 0x10, 0xe0, 0xd9, 0x29, 0x24, 0xd4, 0x3e, 0xce, 0xc3, 0x33, - 0xda, 0x2a, 0x27, 0xd7, 0x3d, 0xcd, 0xc0, 0x30, 0x09, 0xf9, - 0xf4, 0x04, 0xee, 0x1e, 0x13, 0xe3, 0x61, 0x91, 0x9c, 0x6c, - 0x86, 0x76, 0x7b, 0x8b, 0xb2, 0x42, 0x4f, 0xbf, 0x55, 0xa5, - 0xa8, 0x58, 0x67, 0x97, 0x9a, 0x6a, 0x80, 0x70, 0x7d, 0x8d, - 0xb4, 0x44, 0x49, 0xb9, 0x53, 0xa3, 0xae, 0x5e, 0xdc, 0x2c, - 0x21, 0xd1, 0x3b, 0xcb, 0xc6, 0x36, 0x0f, 0xff, 0xf2, 0x02, - 0xe8, 0x18, 0x15, 0xe5, 0x0c, 0xfc, 0xf1, 0x01, 0xeb, 0x1b, - 0x16, 0xe6, 0xdf, 0x2f, 0x22, 0xd2, 0x38, 0xc8, 0xc5, 0x35, - 0xb7, 0x47, 0x4a, 0xba, 0x50, 0xa0, 0xad, 0x5d, 0x64, 0x94, - 0x99, 0x69, 0x83, 0x73, 0x7e, 0x8e, 0x00, 0xf1, 0xff, 0x0e, - 0xe3, 0x12, 0x1c, 0xed, 0xdb, 0x2a, 0x24, 0xd5, 0x38, 0xc9, - 0xc7, 0x36, 0xab, 0x5a, 0x54, 0xa5, 0x48, 0xb9, 0xb7, 0x46, - 0x70, 0x81, 0x8f, 0x7e, 0x93, 0x62, 0x6c, 0x9d, 0x4b, 0xba, - 0xb4, 0x45, 0xa8, 0x59, 0x57, 0xa6, 0x90, 0x61, 0x6f, 0x9e, - 0x73, 0x82, 0x8c, 0x7d, 0xe0, 0x11, 0x1f, 0xee, 0x03, 0xf2, - 0xfc, 0x0d, 0x3b, 0xca, 0xc4, 0x35, 0xd8, 0x29, 0x27, 0xd6, - 0x96, 0x67, 0x69, 0x98, 0x75, 0x84, 0x8a, 0x7b, 0x4d, 0xbc, - 0xb2, 0x43, 0xae, 0x5f, 0x51, 0xa0, 0x3d, 0xcc, 0xc2, 0x33, - 0xde, 0x2f, 0x21, 0xd0, 0xe6, 0x17, 0x19, 0xe8, 0x05, 0xf4, - 0xfa, 0x0b, 0xdd, 0x2c, 0x22, 0xd3, 0x3e, 0xcf, 0xc1, 0x30, - 0x06, 0xf7, 0xf9, 0x08, 0xe5, 0x14, 0x1a, 0xeb, 0x76, 0x87, - 0x89, 0x78, 0x95, 0x64, 0x6a, 0x9b, 0xad, 0x5c, 0x52, 0xa3, - 0x4e, 0xbf, 0xb1, 0x40, 0x31, 0xc0, 0xce, 0x3f, 0xd2, 0x23, - 0x2d, 0xdc, 0xea, 0x1b, 0x15, 0xe4, 0x09, 0xf8, 0xf6, 0x07, - 0x9a, 0x6b, 0x65, 0x94, 0x79, 0x88, 0x86, 0x77, 0x41, 0xb0, - 0xbe, 0x4f, 0xa2, 0x53, 0x5d, 0xac, 0x7a, 0x8b, 0x85, 0x74, - 0x99, 0x68, 0x66, 0x97, 0xa1, 0x50, 0x5e, 0xaf, 0x42, 0xb3, - 0xbd, 0x4c, 0xd1, 0x20, 0x2e, 0xdf, 0x32, 0xc3, 0xcd, 0x3c, - 0x0a, 0xfb, 0xf5, 0x04, 0xe9, 0x18, 0x16, 0xe7, 0xa7, 0x56, - 0x58, 0xa9, 0x44, 0xb5, 0xbb, 0x4a, 0x7c, 0x8d, 0x83, 0x72, - 0x9f, 0x6e, 0x60, 0x91, 0x0c, 0xfd, 0xf3, 0x02, 0xef, 0x1e, - 0x10, 0xe1, 0xd7, 0x26, 0x28, 0xd9, 0x34, 0xc5, 0xcb, 0x3a, - 0xec, 0x1d, 0x13, 0xe2, 0x0f, 0xfe, 0xf0, 0x01, 0x37, 0xc6, - 0xc8, 0x39, 0xd4, 0x25, 0x2b, 0xda, 0x47, 0xb6, 0xb8, 0x49, - 0xa4, 0x55, 0x5b, 0xaa, 0x9c, 0x6d, 0x63, 0x92, 0x7f, 0x8e, - 0x80, 0x71, 0x00, 0xf2, 0xf9, 0x0b, 0xef, 0x1d, 0x16, 0xe4, - 0xc3, 0x31, 0x3a, 0xc8, 0x2c, 0xde, 0xd5, 0x27, 0x9b, 0x69, - 0x62, 0x90, 0x74, 0x86, 0x8d, 0x7f, 0x58, 0xaa, 0xa1, 0x53, - 0xb7, 0x45, 0x4e, 0xbc, 0x2b, 0xd9, 0xd2, 0x20, 0xc4, 0x36, - 0x3d, 0xcf, 0xe8, 0x1a, 0x11, 0xe3, 0x07, 0xf5, 0xfe, 0x0c, - 0xb0, 0x42, 0x49, 0xbb, 0x5f, 0xad, 0xa6, 0x54, 0x73, 0x81, - 0x8a, 0x78, 0x9c, 0x6e, 0x65, 0x97, 0x56, 0xa4, 0xaf, 0x5d, - 0xb9, 0x4b, 0x40, 0xb2, 0x95, 0x67, 0x6c, 0x9e, 0x7a, 0x88, - 0x83, 0x71, 0xcd, 0x3f, 0x34, 0xc6, 0x22, 0xd0, 0xdb, 0x29, - 0x0e, 0xfc, 0xf7, 0x05, 0xe1, 0x13, 0x18, 0xea, 0x7d, 0x8f, - 0x84, 0x76, 0x92, 0x60, 0x6b, 0x99, 0xbe, 0x4c, 0x47, 0xb5, - 0x51, 0xa3, 0xa8, 0x5a, 0xe6, 0x14, 0x1f, 0xed, 0x09, 0xfb, - 0xf0, 0x02, 0x25, 0xd7, 0xdc, 0x2e, 0xca, 0x38, 0x33, 0xc1, - 0xac, 0x5e, 0x55, 0xa7, 0x43, 0xb1, 0xba, 0x48, 0x6f, 0x9d, - 0x96, 0x64, 0x80, 0x72, 0x79, 0x8b, 0x37, 0xc5, 0xce, 0x3c, - 0xd8, 0x2a, 0x21, 0xd3, 0xf4, 0x06, 0x0d, 0xff, 0x1b, 0xe9, - 0xe2, 0x10, 0x87, 0x75, 0x7e, 0x8c, 0x68, 0x9a, 0x91, 0x63, - 0x44, 0xb6, 0xbd, 0x4f, 0xab, 0x59, 0x52, 0xa0, 0x1c, 0xee, - 0xe5, 0x17, 0xf3, 0x01, 0x0a, 0xf8, 0xdf, 0x2d, 0x26, 0xd4, - 0x30, 0xc2, 0xc9, 0x3b, 0xfa, 0x08, 0x03, 0xf1, 0x15, 0xe7, - 0xec, 0x1e, 0x39, 0xcb, 0xc0, 0x32, 0xd6, 0x24, 0x2f, 0xdd, - 0x61, 0x93, 0x98, 0x6a, 0x8e, 0x7c, 0x77, 0x85, 0xa2, 0x50, - 0x5b, 0xa9, 0x4d, 0xbf, 0xb4, 0x46, 0xd1, 0x23, 0x28, 0xda, - 0x3e, 0xcc, 0xc7, 0x35, 0x12, 0xe0, 0xeb, 0x19, 0xfd, 0x0f, - 0x04, 0xf6, 0x4a, 0xb8, 0xb3, 0x41, 0xa5, 0x57, 0x5c, 0xae, - 0x89, 0x7b, 0x70, 0x82, 0x66, 0x94, 0x9f, 0x6d, 0x00, 0xf3, - 0xfb, 0x08, 0xeb, 0x18, 0x10, 0xe3, 0xcb, 0x38, 0x30, 0xc3, - 0x20, 0xd3, 0xdb, 0x28, 0x8b, 0x78, 0x70, 0x83, 0x60, 0x93, - 0x9b, 0x68, 0x40, 0xb3, 0xbb, 0x48, 0xab, 0x58, 0x50, 0xa3, - 0x0b, 0xf8, 0xf0, 0x03, 0xe0, 0x13, 0x1b, 0xe8, 0xc0, 0x33, - 0x3b, 0xc8, 0x2b, 0xd8, 0xd0, 0x23, 0x80, 0x73, 0x7b, 0x88, - 0x6b, 0x98, 0x90, 0x63, 0x4b, 0xb8, 0xb0, 0x43, 0xa0, 0x53, - 0x5b, 0xa8, 0x16, 0xe5, 0xed, 0x1e, 0xfd, 0x0e, 0x06, 0xf5, - 0xdd, 0x2e, 0x26, 0xd5, 0x36, 0xc5, 0xcd, 0x3e, 0x9d, 0x6e, - 0x66, 0x95, 0x76, 0x85, 0x8d, 0x7e, 0x56, 0xa5, 0xad, 0x5e, - 0xbd, 0x4e, 0x46, 0xb5, 0x1d, 0xee, 0xe6, 0x15, 0xf6, 0x05, - 0x0d, 0xfe, 0xd6, 0x25, 0x2d, 0xde, 0x3d, 0xce, 0xc6, 0x35, - 0x96, 0x65, 0x6d, 0x9e, 0x7d, 0x8e, 0x86, 0x75, 0x5d, 0xae, - 0xa6, 0x55, 0xb6, 0x45, 0x4d, 0xbe, 0x2c, 0xdf, 0xd7, 0x24, - 0xc7, 0x34, 0x3c, 0xcf, 0xe7, 0x14, 0x1c, 0xef, 0x0c, 0xff, - 0xf7, 0x04, 0xa7, 0x54, 0x5c, 0xaf, 0x4c, 0xbf, 0xb7, 0x44, - 0x6c, 0x9f, 0x97, 0x64, 0x87, 0x74, 0x7c, 0x8f, 0x27, 0xd4, - 0xdc, 0x2f, 0xcc, 0x3f, 0x37, 0xc4, 0xec, 0x1f, 0x17, 0xe4, - 0x07, 0xf4, 0xfc, 0x0f, 0xac, 0x5f, 0x57, 0xa4, 0x47, 0xb4, - 0xbc, 0x4f, 0x67, 0x94, 0x9c, 0x6f, 0x8c, 0x7f, 0x77, 0x84, - 0x3a, 0xc9, 0xc1, 0x32, 0xd1, 0x22, 0x2a, 0xd9, 0xf1, 0x02, - 0x0a, 0xf9, 0x1a, 0xe9, 0xe1, 0x12, 0xb1, 0x42, 0x4a, 0xb9, - 0x5a, 0xa9, 0xa1, 0x52, 0x7a, 0x89, 0x81, 0x72, 0x91, 0x62, - 0x6a, 0x99, 0x31, 0xc2, 0xca, 0x39, 0xda, 0x29, 0x21, 0xd2, - 0xfa, 0x09, 0x01, 0xf2, 0x11, 0xe2, 0xea, 0x19, 0xba, 0x49, - 0x41, 0xb2, 0x51, 0xa2, 0xaa, 0x59, 0x71, 0x82, 0x8a, 0x79, - 0x9a, 0x69, 0x61, 0x92, 0x00, 0xf4, 0xf5, 0x01, 0xf7, 0x03, - 0x02, 0xf6, 0xf3, 0x07, 0x06, 0xf2, 0x04, 0xf0, 0xf1, 0x05, - 0xfb, 0x0f, 0x0e, 0xfa, 0x0c, 0xf8, 0xf9, 0x0d, 0x08, 0xfc, - 0xfd, 0x09, 0xff, 0x0b, 0x0a, 0xfe, 0xeb, 0x1f, 0x1e, 0xea, - 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, - 0x1a, 0xee, 0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, - 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15, 0xcb, 0x3f, - 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, - 0xcf, 0x3b, 0x3a, 0xce, 0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, - 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35, - 0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, - 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25, 0xdb, 0x2f, 0x2e, 0xda, - 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, - 0x2a, 0xde, 0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, - 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e, 0x70, 0x84, - 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, - 0x74, 0x80, 0x81, 0x75, 0x60, 0x94, 0x95, 0x61, 0x97, 0x63, - 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65, - 0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, - 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e, 0x40, 0xb4, 0xb5, 0x41, - 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, - 0xb1, 0x45, 0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, - 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe, 0xab, 0x5f, - 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, - 0xaf, 0x5b, 0x5a, 0xae, 0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, - 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55, - 0x00, 0xf5, 0xf7, 0x02, 0xf3, 0x06, 0x04, 0xf1, 0xfb, 0x0e, - 0x0c, 0xf9, 0x08, 0xfd, 0xff, 0x0a, 0xeb, 0x1e, 0x1c, 0xe9, - 0x18, 0xed, 0xef, 0x1a, 0x10, 0xe5, 0xe7, 0x12, 0xe3, 0x16, - 0x14, 0xe1, 0xcb, 0x3e, 0x3c, 0xc9, 0x38, 0xcd, 0xcf, 0x3a, - 0x30, 0xc5, 0xc7, 0x32, 0xc3, 0x36, 0x34, 0xc1, 0x20, 0xd5, - 0xd7, 0x22, 0xd3, 0x26, 0x24, 0xd1, 0xdb, 0x2e, 0x2c, 0xd9, - 0x28, 0xdd, 0xdf, 0x2a, 0x8b, 0x7e, 0x7c, 0x89, 0x78, 0x8d, - 0x8f, 0x7a, 0x70, 0x85, 0x87, 0x72, 0x83, 0x76, 0x74, 0x81, - 0x60, 0x95, 0x97, 0x62, 0x93, 0x66, 0x64, 0x91, 0x9b, 0x6e, - 0x6c, 0x99, 0x68, 0x9d, 0x9f, 0x6a, 0x40, 0xb5, 0xb7, 0x42, - 0xb3, 0x46, 0x44, 0xb1, 0xbb, 0x4e, 0x4c, 0xb9, 0x48, 0xbd, - 0xbf, 0x4a, 0xab, 0x5e, 0x5c, 0xa9, 0x58, 0xad, 0xaf, 0x5a, - 0x50, 0xa5, 0xa7, 0x52, 0xa3, 0x56, 0x54, 0xa1, 0x0b, 0xfe, - 0xfc, 0x09, 0xf8, 0x0d, 0x0f, 0xfa, 0xf0, 0x05, 0x07, 0xf2, - 0x03, 0xf6, 0xf4, 0x01, 0xe0, 0x15, 0x17, 0xe2, 0x13, 0xe6, - 0xe4, 0x11, 0x1b, 0xee, 0xec, 0x19, 0xe8, 0x1d, 0x1f, 0xea, - 0xc0, 0x35, 0x37, 0xc2, 0x33, 0xc6, 0xc4, 0x31, 0x3b, 0xce, - 0xcc, 0x39, 0xc8, 0x3d, 0x3f, 0xca, 0x2b, 0xde, 0xdc, 0x29, - 0xd8, 0x2d, 0x2f, 0xda, 0xd0, 0x25, 0x27, 0xd2, 0x23, 0xd6, - 0xd4, 0x21, 0x80, 0x75, 0x77, 0x82, 0x73, 0x86, 0x84, 0x71, - 0x7b, 0x8e, 0x8c, 0x79, 0x88, 0x7d, 0x7f, 0x8a, 0x6b, 0x9e, - 0x9c, 0x69, 0x98, 0x6d, 0x6f, 0x9a, 0x90, 0x65, 0x67, 0x92, - 0x63, 0x96, 0x94, 0x61, 0x4b, 0xbe, 0xbc, 0x49, 0xb8, 0x4d, - 0x4f, 0xba, 0xb0, 0x45, 0x47, 0xb2, 0x43, 0xb6, 0xb4, 0x41, - 0xa0, 0x55, 0x57, 0xa2, 0x53, 0xa6, 0xa4, 0x51, 0x5b, 0xae, - 0xac, 0x59, 0xa8, 0x5d, 0x5f, 0xaa, 0x00, 0xf6, 0xf1, 0x07, - 0xff, 0x09, 0x0e, 0xf8, 0xe3, 0x15, 0x12, 0xe4, 0x1c, 0xea, - 0xed, 0x1b, 0xdb, 0x2d, 0x2a, 0xdc, 0x24, 0xd2, 0xd5, 0x23, - 0x38, 0xce, 0xc9, 0x3f, 0xc7, 0x31, 0x36, 0xc0, 0xab, 0x5d, - 0x5a, 0xac, 0x54, 0xa2, 0xa5, 0x53, 0x48, 0xbe, 0xb9, 0x4f, - 0xb7, 0x41, 0x46, 0xb0, 0x70, 0x86, 0x81, 0x77, 0x8f, 0x79, - 0x7e, 0x88, 0x93, 0x65, 0x62, 0x94, 0x6c, 0x9a, 0x9d, 0x6b, - 0x4b, 0xbd, 0xba, 0x4c, 0xb4, 0x42, 0x45, 0xb3, 0xa8, 0x5e, - 0x59, 0xaf, 0x57, 0xa1, 0xa6, 0x50, 0x90, 0x66, 0x61, 0x97, - 0x6f, 0x99, 0x9e, 0x68, 0x73, 0x85, 0x82, 0x74, 0x8c, 0x7a, - 0x7d, 0x8b, 0xe0, 0x16, 0x11, 0xe7, 0x1f, 0xe9, 0xee, 0x18, - 0x03, 0xf5, 0xf2, 0x04, 0xfc, 0x0a, 0x0d, 0xfb, 0x3b, 0xcd, - 0xca, 0x3c, 0xc4, 0x32, 0x35, 0xc3, 0xd8, 0x2e, 0x29, 0xdf, - 0x27, 0xd1, 0xd6, 0x20, 0x96, 0x60, 0x67, 0x91, 0x69, 0x9f, - 0x98, 0x6e, 0x75, 0x83, 0x84, 0x72, 0x8a, 0x7c, 0x7b, 0x8d, - 0x4d, 0xbb, 0xbc, 0x4a, 0xb2, 0x44, 0x43, 0xb5, 0xae, 0x58, - 0x5f, 0xa9, 0x51, 0xa7, 0xa0, 0x56, 0x3d, 0xcb, 0xcc, 0x3a, - 0xc2, 0x34, 0x33, 0xc5, 0xde, 0x28, 0x2f, 0xd9, 0x21, 0xd7, - 0xd0, 0x26, 0xe6, 0x10, 0x17, 0xe1, 0x19, 0xef, 0xe8, 0x1e, - 0x05, 0xf3, 0xf4, 0x02, 0xfa, 0x0c, 0x0b, 0xfd, 0xdd, 0x2b, - 0x2c, 0xda, 0x22, 0xd4, 0xd3, 0x25, 0x3e, 0xc8, 0xcf, 0x39, - 0xc1, 0x37, 0x30, 0xc6, 0x06, 0xf0, 0xf7, 0x01, 0xf9, 0x0f, - 0x08, 0xfe, 0xe5, 0x13, 0x14, 0xe2, 0x1a, 0xec, 0xeb, 0x1d, - 0x76, 0x80, 0x87, 0x71, 0x89, 0x7f, 0x78, 0x8e, 0x95, 0x63, - 0x64, 0x92, 0x6a, 0x9c, 0x9b, 0x6d, 0xad, 0x5b, 0x5c, 0xaa, - 0x52, 0xa4, 0xa3, 0x55, 0x4e, 0xb8, 0xbf, 0x49, 0xb1, 0x47, - 0x40, 0xb6, 0x00, 0xf7, 0xf3, 0x04, 0xfb, 0x0c, 0x08, 0xff, - 0xeb, 0x1c, 0x18, 0xef, 0x10, 0xe7, 0xe3, 0x14, 0xcb, 0x3c, - 0x38, 0xcf, 0x30, 0xc7, 0xc3, 0x34, 0x20, 0xd7, 0xd3, 0x24, - 0xdb, 0x2c, 0x28, 0xdf, 0x8b, 0x7c, 0x78, 0x8f, 0x70, 0x87, - 0x83, 0x74, 0x60, 0x97, 0x93, 0x64, 0x9b, 0x6c, 0x68, 0x9f, - 0x40, 0xb7, 0xb3, 0x44, 0xbb, 0x4c, 0x48, 0xbf, 0xab, 0x5c, - 0x58, 0xaf, 0x50, 0xa7, 0xa3, 0x54, 0x0b, 0xfc, 0xf8, 0x0f, - 0xf0, 0x07, 0x03, 0xf4, 0xe0, 0x17, 0x13, 0xe4, 0x1b, 0xec, - 0xe8, 0x1f, 0xc0, 0x37, 0x33, 0xc4, 0x3b, 0xcc, 0xc8, 0x3f, - 0x2b, 0xdc, 0xd8, 0x2f, 0xd0, 0x27, 0x23, 0xd4, 0x80, 0x77, - 0x73, 0x84, 0x7b, 0x8c, 0x88, 0x7f, 0x6b, 0x9c, 0x98, 0x6f, - 0x90, 0x67, 0x63, 0x94, 0x4b, 0xbc, 0xb8, 0x4f, 0xb0, 0x47, - 0x43, 0xb4, 0xa0, 0x57, 0x53, 0xa4, 0x5b, 0xac, 0xa8, 0x5f, - 0x16, 0xe1, 0xe5, 0x12, 0xed, 0x1a, 0x1e, 0xe9, 0xfd, 0x0a, - 0x0e, 0xf9, 0x06, 0xf1, 0xf5, 0x02, 0xdd, 0x2a, 0x2e, 0xd9, - 0x26, 0xd1, 0xd5, 0x22, 0x36, 0xc1, 0xc5, 0x32, 0xcd, 0x3a, - 0x3e, 0xc9, 0x9d, 0x6a, 0x6e, 0x99, 0x66, 0x91, 0x95, 0x62, - 0x76, 0x81, 0x85, 0x72, 0x8d, 0x7a, 0x7e, 0x89, 0x56, 0xa1, - 0xa5, 0x52, 0xad, 0x5a, 0x5e, 0xa9, 0xbd, 0x4a, 0x4e, 0xb9, - 0x46, 0xb1, 0xb5, 0x42, 0x1d, 0xea, 0xee, 0x19, 0xe6, 0x11, - 0x15, 0xe2, 0xf6, 0x01, 0x05, 0xf2, 0x0d, 0xfa, 0xfe, 0x09, - 0xd6, 0x21, 0x25, 0xd2, 0x2d, 0xda, 0xde, 0x29, 0x3d, 0xca, - 0xce, 0x39, 0xc6, 0x31, 0x35, 0xc2, 0x96, 0x61, 0x65, 0x92, - 0x6d, 0x9a, 0x9e, 0x69, 0x7d, 0x8a, 0x8e, 0x79, 0x86, 0x71, - 0x75, 0x82, 0x5d, 0xaa, 0xae, 0x59, 0xa6, 0x51, 0x55, 0xa2, - 0xb6, 0x41, 0x45, 0xb2, 0x4d, 0xba, 0xbe, 0x49, 0x00, 0xf8, - 0xed, 0x15, 0xc7, 0x3f, 0x2a, 0xd2, 0x93, 0x6b, 0x7e, 0x86, - 0x54, 0xac, 0xb9, 0x41, 0x3b, 0xc3, 0xd6, 0x2e, 0xfc, 0x04, - 0x11, 0xe9, 0xa8, 0x50, 0x45, 0xbd, 0x6f, 0x97, 0x82, 0x7a, - 0x76, 0x8e, 0x9b, 0x63, 0xb1, 0x49, 0x5c, 0xa4, 0xe5, 0x1d, - 0x08, 0xf0, 0x22, 0xda, 0xcf, 0x37, 0x4d, 0xb5, 0xa0, 0x58, - 0x8a, 0x72, 0x67, 0x9f, 0xde, 0x26, 0x33, 0xcb, 0x19, 0xe1, - 0xf4, 0x0c, 0xec, 0x14, 0x01, 0xf9, 0x2b, 0xd3, 0xc6, 0x3e, - 0x7f, 0x87, 0x92, 0x6a, 0xb8, 0x40, 0x55, 0xad, 0xd7, 0x2f, - 0x3a, 0xc2, 0x10, 0xe8, 0xfd, 0x05, 0x44, 0xbc, 0xa9, 0x51, - 0x83, 0x7b, 0x6e, 0x96, 0x9a, 0x62, 0x77, 0x8f, 0x5d, 0xa5, - 0xb0, 0x48, 0x09, 0xf1, 0xe4, 0x1c, 0xce, 0x36, 0x23, 0xdb, - 0xa1, 0x59, 0x4c, 0xb4, 0x66, 0x9e, 0x8b, 0x73, 0x32, 0xca, - 0xdf, 0x27, 0xf5, 0x0d, 0x18, 0xe0, 0xc5, 0x3d, 0x28, 0xd0, - 0x02, 0xfa, 0xef, 0x17, 0x56, 0xae, 0xbb, 0x43, 0x91, 0x69, - 0x7c, 0x84, 0xfe, 0x06, 0x13, 0xeb, 0x39, 0xc1, 0xd4, 0x2c, - 0x6d, 0x95, 0x80, 0x78, 0xaa, 0x52, 0x47, 0xbf, 0xb3, 0x4b, - 0x5e, 0xa6, 0x74, 0x8c, 0x99, 0x61, 0x20, 0xd8, 0xcd, 0x35, - 0xe7, 0x1f, 0x0a, 0xf2, 0x88, 0x70, 0x65, 0x9d, 0x4f, 0xb7, - 0xa2, 0x5a, 0x1b, 0xe3, 0xf6, 0x0e, 0xdc, 0x24, 0x31, 0xc9, - 0x29, 0xd1, 0xc4, 0x3c, 0xee, 0x16, 0x03, 0xfb, 0xba, 0x42, - 0x57, 0xaf, 0x7d, 0x85, 0x90, 0x68, 0x12, 0xea, 0xff, 0x07, - 0xd5, 0x2d, 0x38, 0xc0, 0x81, 0x79, 0x6c, 0x94, 0x46, 0xbe, - 0xab, 0x53, 0x5f, 0xa7, 0xb2, 0x4a, 0x98, 0x60, 0x75, 0x8d, - 0xcc, 0x34, 0x21, 0xd9, 0x0b, 0xf3, 0xe6, 0x1e, 0x64, 0x9c, - 0x89, 0x71, 0xa3, 0x5b, 0x4e, 0xb6, 0xf7, 0x0f, 0x1a, 0xe2, - 0x30, 0xc8, 0xdd, 0x25, 0x00, 0xf9, 0xef, 0x16, 0xc3, 0x3a, - 0x2c, 0xd5, 0x9b, 0x62, 0x74, 0x8d, 0x58, 0xa1, 0xb7, 0x4e, - 0x2b, 0xd2, 0xc4, 0x3d, 0xe8, 0x11, 0x07, 0xfe, 0xb0, 0x49, - 0x5f, 0xa6, 0x73, 0x8a, 0x9c, 0x65, 0x56, 0xaf, 0xb9, 0x40, - 0x95, 0x6c, 0x7a, 0x83, 0xcd, 0x34, 0x22, 0xdb, 0x0e, 0xf7, - 0xe1, 0x18, 0x7d, 0x84, 0x92, 0x6b, 0xbe, 0x47, 0x51, 0xa8, - 0xe6, 0x1f, 0x09, 0xf0, 0x25, 0xdc, 0xca, 0x33, 0xac, 0x55, - 0x43, 0xba, 0x6f, 0x96, 0x80, 0x79, 0x37, 0xce, 0xd8, 0x21, - 0xf4, 0x0d, 0x1b, 0xe2, 0x87, 0x7e, 0x68, 0x91, 0x44, 0xbd, - 0xab, 0x52, 0x1c, 0xe5, 0xf3, 0x0a, 0xdf, 0x26, 0x30, 0xc9, - 0xfa, 0x03, 0x15, 0xec, 0x39, 0xc0, 0xd6, 0x2f, 0x61, 0x98, - 0x8e, 0x77, 0xa2, 0x5b, 0x4d, 0xb4, 0xd1, 0x28, 0x3e, 0xc7, - 0x12, 0xeb, 0xfd, 0x04, 0x4a, 0xb3, 0xa5, 0x5c, 0x89, 0x70, - 0x66, 0x9f, 0x45, 0xbc, 0xaa, 0x53, 0x86, 0x7f, 0x69, 0x90, - 0xde, 0x27, 0x31, 0xc8, 0x1d, 0xe4, 0xf2, 0x0b, 0x6e, 0x97, - 0x81, 0x78, 0xad, 0x54, 0x42, 0xbb, 0xf5, 0x0c, 0x1a, 0xe3, - 0x36, 0xcf, 0xd9, 0x20, 0x13, 0xea, 0xfc, 0x05, 0xd0, 0x29, - 0x3f, 0xc6, 0x88, 0x71, 0x67, 0x9e, 0x4b, 0xb2, 0xa4, 0x5d, - 0x38, 0xc1, 0xd7, 0x2e, 0xfb, 0x02, 0x14, 0xed, 0xa3, 0x5a, - 0x4c, 0xb5, 0x60, 0x99, 0x8f, 0x76, 0xe9, 0x10, 0x06, 0xff, - 0x2a, 0xd3, 0xc5, 0x3c, 0x72, 0x8b, 0x9d, 0x64, 0xb1, 0x48, - 0x5e, 0xa7, 0xc2, 0x3b, 0x2d, 0xd4, 0x01, 0xf8, 0xee, 0x17, - 0x59, 0xa0, 0xb6, 0x4f, 0x9a, 0x63, 0x75, 0x8c, 0xbf, 0x46, - 0x50, 0xa9, 0x7c, 0x85, 0x93, 0x6a, 0x24, 0xdd, 0xcb, 0x32, - 0xe7, 0x1e, 0x08, 0xf1, 0x94, 0x6d, 0x7b, 0x82, 0x57, 0xae, - 0xb8, 0x41, 0x0f, 0xf6, 0xe0, 0x19, 0xcc, 0x35, 0x23, 0xda, - 0x00, 0xfa, 0xe9, 0x13, 0xcf, 0x35, 0x26, 0xdc, 0x83, 0x79, - 0x6a, 0x90, 0x4c, 0xb6, 0xa5, 0x5f, 0x1b, 0xe1, 0xf2, 0x08, - 0xd4, 0x2e, 0x3d, 0xc7, 0x98, 0x62, 0x71, 0x8b, 0x57, 0xad, - 0xbe, 0x44, 0x36, 0xcc, 0xdf, 0x25, 0xf9, 0x03, 0x10, 0xea, - 0xb5, 0x4f, 0x5c, 0xa6, 0x7a, 0x80, 0x93, 0x69, 0x2d, 0xd7, - 0xc4, 0x3e, 0xe2, 0x18, 0x0b, 0xf1, 0xae, 0x54, 0x47, 0xbd, - 0x61, 0x9b, 0x88, 0x72, 0x6c, 0x96, 0x85, 0x7f, 0xa3, 0x59, - 0x4a, 0xb0, 0xef, 0x15, 0x06, 0xfc, 0x20, 0xda, 0xc9, 0x33, - 0x77, 0x8d, 0x9e, 0x64, 0xb8, 0x42, 0x51, 0xab, 0xf4, 0x0e, - 0x1d, 0xe7, 0x3b, 0xc1, 0xd2, 0x28, 0x5a, 0xa0, 0xb3, 0x49, - 0x95, 0x6f, 0x7c, 0x86, 0xd9, 0x23, 0x30, 0xca, 0x16, 0xec, - 0xff, 0x05, 0x41, 0xbb, 0xa8, 0x52, 0x8e, 0x74, 0x67, 0x9d, - 0xc2, 0x38, 0x2b, 0xd1, 0x0d, 0xf7, 0xe4, 0x1e, 0xd8, 0x22, - 0x31, 0xcb, 0x17, 0xed, 0xfe, 0x04, 0x5b, 0xa1, 0xb2, 0x48, - 0x94, 0x6e, 0x7d, 0x87, 0xc3, 0x39, 0x2a, 0xd0, 0x0c, 0xf6, - 0xe5, 0x1f, 0x40, 0xba, 0xa9, 0x53, 0x8f, 0x75, 0x66, 0x9c, - 0xee, 0x14, 0x07, 0xfd, 0x21, 0xdb, 0xc8, 0x32, 0x6d, 0x97, - 0x84, 0x7e, 0xa2, 0x58, 0x4b, 0xb1, 0xf5, 0x0f, 0x1c, 0xe6, - 0x3a, 0xc0, 0xd3, 0x29, 0x76, 0x8c, 0x9f, 0x65, 0xb9, 0x43, - 0x50, 0xaa, 0xb4, 0x4e, 0x5d, 0xa7, 0x7b, 0x81, 0x92, 0x68, - 0x37, 0xcd, 0xde, 0x24, 0xf8, 0x02, 0x11, 0xeb, 0xaf, 0x55, - 0x46, 0xbc, 0x60, 0x9a, 0x89, 0x73, 0x2c, 0xd6, 0xc5, 0x3f, - 0xe3, 0x19, 0x0a, 0xf0, 0x82, 0x78, 0x6b, 0x91, 0x4d, 0xb7, - 0xa4, 0x5e, 0x01, 0xfb, 0xe8, 0x12, 0xce, 0x34, 0x27, 0xdd, - 0x99, 0x63, 0x70, 0x8a, 0x56, 0xac, 0xbf, 0x45, 0x1a, 0xe0, - 0xf3, 0x09, 0xd5, 0x2f, 0x3c, 0xc6, 0x00, 0xfb, 0xeb, 0x10, - 0xcb, 0x30, 0x20, 0xdb, 0x8b, 0x70, 0x60, 0x9b, 0x40, 0xbb, - 0xab, 0x50, 0x0b, 0xf0, 0xe0, 0x1b, 0xc0, 0x3b, 0x2b, 0xd0, - 0x80, 0x7b, 0x6b, 0x90, 0x4b, 0xb0, 0xa0, 0x5b, 0x16, 0xed, - 0xfd, 0x06, 0xdd, 0x26, 0x36, 0xcd, 0x9d, 0x66, 0x76, 0x8d, - 0x56, 0xad, 0xbd, 0x46, 0x1d, 0xe6, 0xf6, 0x0d, 0xd6, 0x2d, - 0x3d, 0xc6, 0x96, 0x6d, 0x7d, 0x86, 0x5d, 0xa6, 0xb6, 0x4d, - 0x2c, 0xd7, 0xc7, 0x3c, 0xe7, 0x1c, 0x0c, 0xf7, 0xa7, 0x5c, - 0x4c, 0xb7, 0x6c, 0x97, 0x87, 0x7c, 0x27, 0xdc, 0xcc, 0x37, - 0xec, 0x17, 0x07, 0xfc, 0xac, 0x57, 0x47, 0xbc, 0x67, 0x9c, - 0x8c, 0x77, 0x3a, 0xc1, 0xd1, 0x2a, 0xf1, 0x0a, 0x1a, 0xe1, - 0xb1, 0x4a, 0x5a, 0xa1, 0x7a, 0x81, 0x91, 0x6a, 0x31, 0xca, - 0xda, 0x21, 0xfa, 0x01, 0x11, 0xea, 0xba, 0x41, 0x51, 0xaa, - 0x71, 0x8a, 0x9a, 0x61, 0x58, 0xa3, 0xb3, 0x48, 0x93, 0x68, - 0x78, 0x83, 0xd3, 0x28, 0x38, 0xc3, 0x18, 0xe3, 0xf3, 0x08, - 0x53, 0xa8, 0xb8, 0x43, 0x98, 0x63, 0x73, 0x88, 0xd8, 0x23, - 0x33, 0xc8, 0x13, 0xe8, 0xf8, 0x03, 0x4e, 0xb5, 0xa5, 0x5e, - 0x85, 0x7e, 0x6e, 0x95, 0xc5, 0x3e, 0x2e, 0xd5, 0x0e, 0xf5, - 0xe5, 0x1e, 0x45, 0xbe, 0xae, 0x55, 0x8e, 0x75, 0x65, 0x9e, - 0xce, 0x35, 0x25, 0xde, 0x05, 0xfe, 0xee, 0x15, 0x74, 0x8f, - 0x9f, 0x64, 0xbf, 0x44, 0x54, 0xaf, 0xff, 0x04, 0x14, 0xef, - 0x34, 0xcf, 0xdf, 0x24, 0x7f, 0x84, 0x94, 0x6f, 0xb4, 0x4f, - 0x5f, 0xa4, 0xf4, 0x0f, 0x1f, 0xe4, 0x3f, 0xc4, 0xd4, 0x2f, - 0x62, 0x99, 0x89, 0x72, 0xa9, 0x52, 0x42, 0xb9, 0xe9, 0x12, - 0x02, 0xf9, 0x22, 0xd9, 0xc9, 0x32, 0x69, 0x92, 0x82, 0x79, - 0xa2, 0x59, 0x49, 0xb2, 0xe2, 0x19, 0x09, 0xf2, 0x29, 0xd2, - 0xc2, 0x39, 0x00, 0xfc, 0xe5, 0x19, 0xd7, 0x2b, 0x32, 0xce, - 0xb3, 0x4f, 0x56, 0xaa, 0x64, 0x98, 0x81, 0x7d, 0x7b, 0x87, - 0x9e, 0x62, 0xac, 0x50, 0x49, 0xb5, 0xc8, 0x34, 0x2d, 0xd1, - 0x1f, 0xe3, 0xfa, 0x06, 0xf6, 0x0a, 0x13, 0xef, 0x21, 0xdd, - 0xc4, 0x38, 0x45, 0xb9, 0xa0, 0x5c, 0x92, 0x6e, 0x77, 0x8b, - 0x8d, 0x71, 0x68, 0x94, 0x5a, 0xa6, 0xbf, 0x43, 0x3e, 0xc2, - 0xdb, 0x27, 0xe9, 0x15, 0x0c, 0xf0, 0xf1, 0x0d, 0x14, 0xe8, - 0x26, 0xda, 0xc3, 0x3f, 0x42, 0xbe, 0xa7, 0x5b, 0x95, 0x69, - 0x70, 0x8c, 0x8a, 0x76, 0x6f, 0x93, 0x5d, 0xa1, 0xb8, 0x44, - 0x39, 0xc5, 0xdc, 0x20, 0xee, 0x12, 0x0b, 0xf7, 0x07, 0xfb, - 0xe2, 0x1e, 0xd0, 0x2c, 0x35, 0xc9, 0xb4, 0x48, 0x51, 0xad, - 0x63, 0x9f, 0x86, 0x7a, 0x7c, 0x80, 0x99, 0x65, 0xab, 0x57, - 0x4e, 0xb2, 0xcf, 0x33, 0x2a, 0xd6, 0x18, 0xe4, 0xfd, 0x01, - 0xff, 0x03, 0x1a, 0xe6, 0x28, 0xd4, 0xcd, 0x31, 0x4c, 0xb0, - 0xa9, 0x55, 0x9b, 0x67, 0x7e, 0x82, 0x84, 0x78, 0x61, 0x9d, - 0x53, 0xaf, 0xb6, 0x4a, 0x37, 0xcb, 0xd2, 0x2e, 0xe0, 0x1c, - 0x05, 0xf9, 0x09, 0xf5, 0xec, 0x10, 0xde, 0x22, 0x3b, 0xc7, - 0xba, 0x46, 0x5f, 0xa3, 0x6d, 0x91, 0x88, 0x74, 0x72, 0x8e, - 0x97, 0x6b, 0xa5, 0x59, 0x40, 0xbc, 0xc1, 0x3d, 0x24, 0xd8, - 0x16, 0xea, 0xf3, 0x0f, 0x0e, 0xf2, 0xeb, 0x17, 0xd9, 0x25, - 0x3c, 0xc0, 0xbd, 0x41, 0x58, 0xa4, 0x6a, 0x96, 0x8f, 0x73, - 0x75, 0x89, 0x90, 0x6c, 0xa2, 0x5e, 0x47, 0xbb, 0xc6, 0x3a, - 0x23, 0xdf, 0x11, 0xed, 0xf4, 0x08, 0xf8, 0x04, 0x1d, 0xe1, - 0x2f, 0xd3, 0xca, 0x36, 0x4b, 0xb7, 0xae, 0x52, 0x9c, 0x60, - 0x79, 0x85, 0x83, 0x7f, 0x66, 0x9a, 0x54, 0xa8, 0xb1, 0x4d, - 0x30, 0xcc, 0xd5, 0x29, 0xe7, 0x1b, 0x02, 0xfe, 0x00, 0xfd, - 0xe7, 0x1a, 0xd3, 0x2e, 0x34, 0xc9, 0xbb, 0x46, 0x5c, 0xa1, - 0x68, 0x95, 0x8f, 0x72, 0x6b, 0x96, 0x8c, 0x71, 0xb8, 0x45, - 0x5f, 0xa2, 0xd0, 0x2d, 0x37, 0xca, 0x03, 0xfe, 0xe4, 0x19, - 0xd6, 0x2b, 0x31, 0xcc, 0x05, 0xf8, 0xe2, 0x1f, 0x6d, 0x90, - 0x8a, 0x77, 0xbe, 0x43, 0x59, 0xa4, 0xbd, 0x40, 0x5a, 0xa7, - 0x6e, 0x93, 0x89, 0x74, 0x06, 0xfb, 0xe1, 0x1c, 0xd5, 0x28, - 0x32, 0xcf, 0xb1, 0x4c, 0x56, 0xab, 0x62, 0x9f, 0x85, 0x78, - 0x0a, 0xf7, 0xed, 0x10, 0xd9, 0x24, 0x3e, 0xc3, 0xda, 0x27, - 0x3d, 0xc0, 0x09, 0xf4, 0xee, 0x13, 0x61, 0x9c, 0x86, 0x7b, - 0xb2, 0x4f, 0x55, 0xa8, 0x67, 0x9a, 0x80, 0x7d, 0xb4, 0x49, - 0x53, 0xae, 0xdc, 0x21, 0x3b, 0xc6, 0x0f, 0xf2, 0xe8, 0x15, - 0x0c, 0xf1, 0xeb, 0x16, 0xdf, 0x22, 0x38, 0xc5, 0xb7, 0x4a, - 0x50, 0xad, 0x64, 0x99, 0x83, 0x7e, 0x7f, 0x82, 0x98, 0x65, - 0xac, 0x51, 0x4b, 0xb6, 0xc4, 0x39, 0x23, 0xde, 0x17, 0xea, - 0xf0, 0x0d, 0x14, 0xe9, 0xf3, 0x0e, 0xc7, 0x3a, 0x20, 0xdd, - 0xaf, 0x52, 0x48, 0xb5, 0x7c, 0x81, 0x9b, 0x66, 0xa9, 0x54, - 0x4e, 0xb3, 0x7a, 0x87, 0x9d, 0x60, 0x12, 0xef, 0xf5, 0x08, - 0xc1, 0x3c, 0x26, 0xdb, 0xc2, 0x3f, 0x25, 0xd8, 0x11, 0xec, - 0xf6, 0x0b, 0x79, 0x84, 0x9e, 0x63, 0xaa, 0x57, 0x4d, 0xb0, - 0xce, 0x33, 0x29, 0xd4, 0x1d, 0xe0, 0xfa, 0x07, 0x75, 0x88, - 0x92, 0x6f, 0xa6, 0x5b, 0x41, 0xbc, 0xa5, 0x58, 0x42, 0xbf, - 0x76, 0x8b, 0x91, 0x6c, 0x1e, 0xe3, 0xf9, 0x04, 0xcd, 0x30, - 0x2a, 0xd7, 0x18, 0xe5, 0xff, 0x02, 0xcb, 0x36, 0x2c, 0xd1, - 0xa3, 0x5e, 0x44, 0xb9, 0x70, 0x8d, 0x97, 0x6a, 0x73, 0x8e, - 0x94, 0x69, 0xa0, 0x5d, 0x47, 0xba, 0xc8, 0x35, 0x2f, 0xd2, - 0x1b, 0xe6, 0xfc, 0x01, 0x00, 0xfe, 0xe1, 0x1f, 0xdf, 0x21, - 0x3e, 0xc0, 0xa3, 0x5d, 0x42, 0xbc, 0x7c, 0x82, 0x9d, 0x63, - 0x5b, 0xa5, 0xba, 0x44, 0x84, 0x7a, 0x65, 0x9b, 0xf8, 0x06, - 0x19, 0xe7, 0x27, 0xd9, 0xc6, 0x38, 0xb6, 0x48, 0x57, 0xa9, - 0x69, 0x97, 0x88, 0x76, 0x15, 0xeb, 0xf4, 0x0a, 0xca, 0x34, - 0x2b, 0xd5, 0xed, 0x13, 0x0c, 0xf2, 0x32, 0xcc, 0xd3, 0x2d, - 0x4e, 0xb0, 0xaf, 0x51, 0x91, 0x6f, 0x70, 0x8e, 0x71, 0x8f, - 0x90, 0x6e, 0xae, 0x50, 0x4f, 0xb1, 0xd2, 0x2c, 0x33, 0xcd, - 0x0d, 0xf3, 0xec, 0x12, 0x2a, 0xd4, 0xcb, 0x35, 0xf5, 0x0b, - 0x14, 0xea, 0x89, 0x77, 0x68, 0x96, 0x56, 0xa8, 0xb7, 0x49, - 0xc7, 0x39, 0x26, 0xd8, 0x18, 0xe6, 0xf9, 0x07, 0x64, 0x9a, - 0x85, 0x7b, 0xbb, 0x45, 0x5a, 0xa4, 0x9c, 0x62, 0x7d, 0x83, - 0x43, 0xbd, 0xa2, 0x5c, 0x3f, 0xc1, 0xde, 0x20, 0xe0, 0x1e, - 0x01, 0xff, 0xe2, 0x1c, 0x03, 0xfd, 0x3d, 0xc3, 0xdc, 0x22, - 0x41, 0xbf, 0xa0, 0x5e, 0x9e, 0x60, 0x7f, 0x81, 0xb9, 0x47, - 0x58, 0xa6, 0x66, 0x98, 0x87, 0x79, 0x1a, 0xe4, 0xfb, 0x05, - 0xc5, 0x3b, 0x24, 0xda, 0x54, 0xaa, 0xb5, 0x4b, 0x8b, 0x75, - 0x6a, 0x94, 0xf7, 0x09, 0x16, 0xe8, 0x28, 0xd6, 0xc9, 0x37, - 0x0f, 0xf1, 0xee, 0x10, 0xd0, 0x2e, 0x31, 0xcf, 0xac, 0x52, - 0x4d, 0xb3, 0x73, 0x8d, 0x92, 0x6c, 0x93, 0x6d, 0x72, 0x8c, - 0x4c, 0xb2, 0xad, 0x53, 0x30, 0xce, 0xd1, 0x2f, 0xef, 0x11, - 0x0e, 0xf0, 0xc8, 0x36, 0x29, 0xd7, 0x17, 0xe9, 0xf6, 0x08, - 0x6b, 0x95, 0x8a, 0x74, 0xb4, 0x4a, 0x55, 0xab, 0x25, 0xdb, - 0xc4, 0x3a, 0xfa, 0x04, 0x1b, 0xe5, 0x86, 0x78, 0x67, 0x99, - 0x59, 0xa7, 0xb8, 0x46, 0x7e, 0x80, 0x9f, 0x61, 0xa1, 0x5f, - 0x40, 0xbe, 0xdd, 0x23, 0x3c, 0xc2, 0x02, 0xfc, 0xe3, 0x1d, - 0x00, 0xff, 0xe3, 0x1c, 0xdb, 0x24, 0x38, 0xc7, 0xab, 0x54, - 0x48, 0xb7, 0x70, 0x8f, 0x93, 0x6c, 0x4b, 0xb4, 0xa8, 0x57, - 0x90, 0x6f, 0x73, 0x8c, 0xe0, 0x1f, 0x03, 0xfc, 0x3b, 0xc4, - 0xd8, 0x27, 0x96, 0x69, 0x75, 0x8a, 0x4d, 0xb2, 0xae, 0x51, - 0x3d, 0xc2, 0xde, 0x21, 0xe6, 0x19, 0x05, 0xfa, 0xdd, 0x22, - 0x3e, 0xc1, 0x06, 0xf9, 0xe5, 0x1a, 0x76, 0x89, 0x95, 0x6a, - 0xad, 0x52, 0x4e, 0xb1, 0x31, 0xce, 0xd2, 0x2d, 0xea, 0x15, - 0x09, 0xf6, 0x9a, 0x65, 0x79, 0x86, 0x41, 0xbe, 0xa2, 0x5d, - 0x7a, 0x85, 0x99, 0x66, 0xa1, 0x5e, 0x42, 0xbd, 0xd1, 0x2e, - 0x32, 0xcd, 0x0a, 0xf5, 0xe9, 0x16, 0xa7, 0x58, 0x44, 0xbb, - 0x7c, 0x83, 0x9f, 0x60, 0x0c, 0xf3, 0xef, 0x10, 0xd7, 0x28, - 0x34, 0xcb, 0xec, 0x13, 0x0f, 0xf0, 0x37, 0xc8, 0xd4, 0x2b, - 0x47, 0xb8, 0xa4, 0x5b, 0x9c, 0x63, 0x7f, 0x80, 0x62, 0x9d, - 0x81, 0x7e, 0xb9, 0x46, 0x5a, 0xa5, 0xc9, 0x36, 0x2a, 0xd5, - 0x12, 0xed, 0xf1, 0x0e, 0x29, 0xd6, 0xca, 0x35, 0xf2, 0x0d, - 0x11, 0xee, 0x82, 0x7d, 0x61, 0x9e, 0x59, 0xa6, 0xba, 0x45, - 0xf4, 0x0b, 0x17, 0xe8, 0x2f, 0xd0, 0xcc, 0x33, 0x5f, 0xa0, - 0xbc, 0x43, 0x84, 0x7b, 0x67, 0x98, 0xbf, 0x40, 0x5c, 0xa3, - 0x64, 0x9b, 0x87, 0x78, 0x14, 0xeb, 0xf7, 0x08, 0xcf, 0x30, - 0x2c, 0xd3, 0x53, 0xac, 0xb0, 0x4f, 0x88, 0x77, 0x6b, 0x94, - 0xf8, 0x07, 0x1b, 0xe4, 0x23, 0xdc, 0xc0, 0x3f, 0x18, 0xe7, - 0xfb, 0x04, 0xc3, 0x3c, 0x20, 0xdf, 0xb3, 0x4c, 0x50, 0xaf, - 0x68, 0x97, 0x8b, 0x74, 0xc5, 0x3a, 0x26, 0xd9, 0x1e, 0xe1, - 0xfd, 0x02, 0x6e, 0x91, 0x8d, 0x72, 0xb5, 0x4a, 0x56, 0xa9, - 0x8e, 0x71, 0x6d, 0x92, 0x55, 0xaa, 0xb6, 0x49, 0x25, 0xda, - 0xc6, 0x39, 0xfe, 0x01, 0x1d, 0xe2 -}; - -unsigned char gf_inv_table_base[] = { - 0x00, 0x01, 0x8e, 0xf4, 0x47, 0xa7, 0x7a, 0xba, 0xad, 0x9d, - 0xdd, 0x98, 0x3d, 0xaa, 0x5d, 0x96, 0xd8, 0x72, 0xc0, 0x58, - 0xe0, 0x3e, 0x4c, 0x66, 0x90, 0xde, 0x55, 0x80, 0xa0, 0x83, - 0x4b, 0x2a, 0x6c, 0xed, 0x39, 0x51, 0x60, 0x56, 0x2c, 0x8a, - 0x70, 0xd0, 0x1f, 0x4a, 0x26, 0x8b, 0x33, 0x6e, 0x48, 0x89, - 0x6f, 0x2e, 0xa4, 0xc3, 0x40, 0x5e, 0x50, 0x22, 0xcf, 0xa9, - 0xab, 0x0c, 0x15, 0xe1, 0x36, 0x5f, 0xf8, 0xd5, 0x92, 0x4e, - 0xa6, 0x04, 0x30, 0x88, 0x2b, 0x1e, 0x16, 0x67, 0x45, 0x93, - 0x38, 0x23, 0x68, 0x8c, 0x81, 0x1a, 0x25, 0x61, 0x13, 0xc1, - 0xcb, 0x63, 0x97, 0x0e, 0x37, 0x41, 0x24, 0x57, 0xca, 0x5b, - 0xb9, 0xc4, 0x17, 0x4d, 0x52, 0x8d, 0xef, 0xb3, 0x20, 0xec, - 0x2f, 0x32, 0x28, 0xd1, 0x11, 0xd9, 0xe9, 0xfb, 0xda, 0x79, - 0xdb, 0x77, 0x06, 0xbb, 0x84, 0xcd, 0xfe, 0xfc, 0x1b, 0x54, - 0xa1, 0x1d, 0x7c, 0xcc, 0xe4, 0xb0, 0x49, 0x31, 0x27, 0x2d, - 0x53, 0x69, 0x02, 0xf5, 0x18, 0xdf, 0x44, 0x4f, 0x9b, 0xbc, - 0x0f, 0x5c, 0x0b, 0xdc, 0xbd, 0x94, 0xac, 0x09, 0xc7, 0xa2, - 0x1c, 0x82, 0x9f, 0xc6, 0x34, 0xc2, 0x46, 0x05, 0xce, 0x3b, - 0x0d, 0x3c, 0x9c, 0x08, 0xbe, 0xb7, 0x87, 0xe5, 0xee, 0x6b, - 0xeb, 0xf2, 0xbf, 0xaf, 0xc5, 0x64, 0x07, 0x7b, 0x95, 0x9a, - 0xae, 0xb6, 0x12, 0x59, 0xa5, 0x35, 0x65, 0xb8, 0xa3, 0x9e, - 0xd2, 0xf7, 0x62, 0x5a, 0x85, 0x7d, 0xa8, 0x3a, 0x29, 0x71, - 0xc8, 0xf6, 0xf9, 0x43, 0xd7, 0xd6, 0x10, 0x73, 0x76, 0x78, - 0x99, 0x0a, 0x19, 0x91, 0x14, 0x3f, 0xe6, 0xf0, 0x86, 0xb1, - 0xe2, 0xf1, 0xfa, 0x74, 0xf3, 0xb4, 0x6d, 0x21, 0xb2, 0x6a, - 0xe3, 0xe7, 0xb5, 0xea, 0x03, 0x8f, 0xd3, 0xc9, 0x42, 0xd4, - 0xe8, 0x75, 0x7f, 0xff, 0x7e, 0xfd -}; -#endif // GF_LARGE_TABLES - -#endif //_EC_BASE_H_ diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_code.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_code.h deleted file mode 100644 index 570944c37..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_code.h +++ /dev/null @@ -1,933 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - - -#ifndef _ERASURE_CODE_H_ -#define _ERASURE_CODE_H_ - -/** - * @file erasure_code.h - * @brief Interface to functions supporting erasure code encode and decode. - * - * This file defines the interface to optimized functions used in erasure - * codes. Encode and decode of erasures in GF(2^8) are made by calculating the - * dot product of the symbols (bytes in GF(2^8)) across a set of buffers and a - * set of coefficients. Values for the coefficients are determined by the type - * of erasure code. Using a general dot product means that any sequence of - * coefficients may be used including erasure codes based on random - * coefficients. - * Multiple versions of dot product are supplied to calculate 1-6 output - * vectors in one pass. - * Base GF multiply and divide functions can be sped up by defining - * GF_LARGE_TABLES at the expense of memory size. - * - */ - -#include "gf_vect_mul.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize tables for fast Erasure Code encode and decode. - * - * Generates the expanded tables needed for fast encode or decode for erasure - * codes on blocks of data. 32bytes is generated for each input coefficient. - * - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param a Pointer to sets of arrays of input coefficients used to encode - * or decode data. - * @param gftbls Pointer to start of space for concatenated output tables - * generated from input coefficients. Must be of size 32*k*rows. - * @returns none - */ - -void ec_init_tables(int k, int rows, unsigned char* a, unsigned char* gftbls); - -/** - * @brief Generate or decode erasure codes on blocks of data, runs appropriate version. - * - * Given a list of source data blocks, generate one or multiple blocks of - * encoded data as specified by a matrix of GF(2^8) coefficients. When given a - * suitable set of coefficients, this function will perform the fast generation - * or decoding of Reed-Solomon type erasure codes. - * - * This function determines what instruction sets are enabled and - * selects the appropriate version at runtime. - * - * @param len Length of each block of data (vector) of source or dest data. - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*k*rows - * @param data Array of pointers to source input buffers. - * @param coding Array of pointers to coded output buffers. - * @returns none - */ - -void ec_encode_data(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires SSE4.1 - */ -void ec_encode_data_sse(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires AVX - */ -void ec_encode_data_avx(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires AVX2 - */ -void ec_encode_data_avx2(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data, runs baseline version. - * - * Baseline version of ec_encode_data() with same parameters. - */ -void ec_encode_data_base(int len, int srcs, int dests, unsigned char *v, unsigned char **src, - unsigned char **dest); - -/** - * @brief Generate update for encode or decode of erasure codes from single source, runs appropriate version. - * - * Given one source data block, update one or multiple blocks of encoded data as - * specified by a matrix of GF(2^8) coefficients. When given a suitable set of - * coefficients, this function will perform the fast generation or decoding of - * Reed-Solomon type erasure codes from one input source at a time. - * - * This function determines what instruction sets are enabled and selects the - * appropriate version at runtime. - * - * @param len Length of each block of data (vector) of source or dest data. - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param vec_i The vector index corresponding to the single input source. - * @param g_tbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*k*rows - * @param data Pointer to single input source used to update output parity. - * @param coding Array of pointers to coded output buffers. - * @returns none - */ -void ec_encode_data_update(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires SSE4.1 - */ - -void ec_encode_data_update_sse(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires AVX - */ - -void ec_encode_data_update_avx(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires AVX2 - */ - -void ec_encode_data_update_avx2(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Baseline version of ec_encode_data_update(). - */ - -void ec_encode_data_update_base(int len, int k, int rows, int vec_i, unsigned char *v, - unsigned char *data, unsigned char **dest); - - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product, runs baseline version. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. Only elements 32*CONST*j + 1 - * of this array are used, where j = (0, 1, 2...) and CONST is the - * number of elements in the array of input coefficients. The - * elements used correspond to the original input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_base(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product, runs appropriate version. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * - * This function determines what instruction sets are enabled and - * selects the appropriate version at runtime. - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - - -/** - * @brief GF(2^8) vector multiply accumulate, runs appropriate version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constant and add to destination array. Can be used for erasure coding encode - * and decode update when only one source is available at a time. Function - * requires pre-calculation of a 32*vec byte constant array based on the input - * coefficients. - * - * This function determines what instruction sets are enabled and selects the - * appropriate version at runtime. - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_mad(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires SSE4.1 - */ - -void gf_vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires AVX - */ - -void gf_vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires AVX2 - */ - -void gf_vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, baseline version. - * - * Baseline version of gf_vect_mad() with same parameters. - */ - -void gf_vect_mad_base(int len, int vec, int vec_i, unsigned char *v, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply with 2 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_2vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 2 accumulate. AVX version of gf_2vect_mad_sse(). - * @requires AVX - */ -void gf_2vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 2 accumulate. AVX2 version of gf_2vect_mad_sse(). - * @requires AVX2 - */ -void gf_2vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_3vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. AVX version of gf_3vect_mad_sse(). - * @requires AVX - */ -void gf_3vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. AVX2 version of gf_3vect_mad_sse(). - * @requires AVX2 - */ -void gf_3vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 4 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_4vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 4 accumulate. AVX version of gf_4vect_mad_sse(). - * @requires AVX - */ -void gf_4vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 4 accumulate. AVX2 version of gf_4vect_mad_sse(). - * @requires AVX2 - */ -void gf_4vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 5 accumulate. SSE version. - * @requires SSE4.1 - */ -void gf_5vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 5 accumulate. AVX version. - * @requires AVX - */ -void gf_5vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 5 accumulate. AVX2 version. - * @requires AVX2 - */ -void gf_5vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 6 accumulate. SSE version. - * @requires SSE4.1 - */ -void gf_6vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 6 accumulate. AVX version. - * @requires AVX - */ -void gf_6vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 6 accumulate. AVX2 version. - * @requires AVX2 - */ -void gf_6vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - - -/********************************************************************** - * The remaining are lib support functions used in GF(2^8) operations. - */ - -/** - * @brief Single element GF(2^8) multiply. - * - * @param a Multiplicand a - * @param b Multiplicand b - * @returns Product of a and b in GF(2^8) - */ - -unsigned char gf_mul(unsigned char a, unsigned char b); - -/** - * @brief Single element GF(2^8) inverse. - * - * @param a Input element - * @returns Field element b such that a x b = {1} - */ - -unsigned char gf_inv(unsigned char a); - -/** - * @brief Generate a matrix of coefficients to be used for encoding. - * - * Vandermonde matrix example of encoding coefficients where high portion of - * matrix is identity matrix I and lower portion is constructed as 2^{i*(j-k+1)} - * i:{0,k-1} j:{k,m-1}. Commonly used method for choosing coefficients in - * erasure encoding but does not guarantee invertable for every sub matrix. For - * large k it is possible to find cases where the decode matrix chosen from - * sources and parity not in erasure are not invertable. Users may want to - * adjust for k > 5. - * - * @param a [mxk] array to hold coefficients - * @param m number of rows in matrix corresponding to srcs + parity. - * @param k number of columns in matrix corresponding to srcs. - * @returns none - */ - -void gf_gen_rs_matrix(unsigned char *a, int m, int k); - -/** - * @brief Generate a Cauchy matrix of coefficients to be used for encoding. - * - * Cauchy matrix example of encoding coefficients where high portion of matrix - * is identity matrix I and lower portion is constructed as 1/(i + j) | i != j, - * i:{0,k-1} j:{k,m-1}. Any sub-matrix of a Cauchy matrix should be invertable. - * - * @param a [mxk] array to hold coefficients - * @param m number of rows in matrix corresponding to srcs + parity. - * @param k number of columns in matrix corresponding to srcs. - * @returns none - */ - -void gf_gen_cauchy1_matrix(unsigned char *a, int m, int k); - -/** - * @brief Invert a matrix in GF(2^8) - * - * @param in input matrix - * @param out output matrix such that [in] x [out] = [I] - identity matrix - * @param n size of matrix [nxn] - * @returns 0 successful, other fail on singular input matrix - */ - -int gf_invert_matrix(unsigned char *in, unsigned char *out, const int n); - - -/*************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif //_ERASURE_CODE_H_ diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_highlevel_func.c b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_highlevel_func.c deleted file mode 100644 index 9b9c8dc0f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_highlevel_func.c +++ /dev/null @@ -1,267 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ -#include -#include "ec_code.h" -#include "ec_types.h" - -void ec_init_tables(int k, int rows, unsigned char *a, unsigned char *g_tbls) -{ - int i, j; - - for (i = 0; i < rows; i++) { - for (j = 0; j < k; j++) { - gf_vect_mul_init(*a++, g_tbls); - g_tbls += 32; - } - } -} - -void ec_encode_data_sse(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - - if (len < 16) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_sse(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_sse(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_sse(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_sse(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_avx(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_avx(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_avx(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_avx(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_avx(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_avx2(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - - if (len < 32) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_avx2(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_avx2(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_avx2(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_avx2(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -#if __WORDSIZE == 64 || _WIN64 || __x86_64__ - -void ec_encode_data_update_sse(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - - while (rows > 6) { - gf_6vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_sse(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_update_avx(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - while (rows > 6) { - gf_6vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_avx(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_update_avx2(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 32) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - while (rows > 6) { - gf_6vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_avx2(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -#endif //__WORDSIZE == 64 || _WIN64 || __x86_64__ - -struct slver { - UINT16 snum; - UINT8 ver; - UINT8 core; -}; - -// Version info -struct slver ec_init_tables_slver_00010068; -struct slver ec_init_tables_slver = { 0x0068, 0x01, 0x00 }; - -struct slver ec_encode_data_sse_slver_00020069; -struct slver ec_encode_data_sse_slver = { 0x0069, 0x02, 0x00 }; diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_isal-l.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_isal-l.h deleted file mode 100644 index 77be0812a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_isal-l.h +++ /dev/null @@ -1,41 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - -#ifndef _ISAL_H_ -#define _ISAL_H_ - -#define ISAL_MAJOR_VERSION 2 -#define ISAL_MINOR_VERSION 13 -#define ISAL_PATCH_VERSION 0 -#define ISAL_MAKE_VERSION(maj, min, patch) ((maj) * 0x10000 + (min) * 0x100 + (patch)) -#define ISAL_VERSION ISAL_MAKE_VERSION(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION) - -#include "ec_code.h" -#include "gf_vect_mul.h" -#endif //_ISAL_H_ diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_common.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_common.h deleted file mode 100644 index 75f4cbc16..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_common.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Mini Object Storage, (C) 2014 Minio, 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. - */ - -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#include - -int32_t minio_init_encoder (int technique, int k, int m, - unsigned char **encode_matrix, - unsigned char **encode_tbls); - -int32_t minio_init_decoder (int32_t *error_index, - int k, int n, int errs, - unsigned char *encoding_matrix, - unsigned char **decode_matrix, - unsigned char **decode_tbls, - uint32_t **decode_index); - -int32_t minio_get_source_target (int errs, int k, int m, - int32_t *error_index, - uint32_t *decode_index, - unsigned char **buffs, - unsigned char ***source, - unsigned char ***target); -#endif /* __COMMON_H__ */ diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_decode.c b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_decode.c deleted file mode 100644 index a40967024..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_decode.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, 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. - */ - -#include -#include -#include - -#include "ec_isal-l.h" -#include "ec_minio_common.h" - -static -int32_t _minio_src_index_in_error (int r, int32_t *error_index) -{ - int i; - for (i = 0; error_index[i] != -1; i++) { - if (error_index[i] == r) { - // true - return 1; - } - } - // false - return 0; -} - -// Separate out source data and target buffers -int32_t minio_get_source_target (int errs, int k, int m, - int32_t *error_index, - uint32_t *decode_index, - unsigned char **buffs, - unsigned char ***source, - unsigned char ***target) -{ - int i; - unsigned char *tmp_source[k]; - unsigned char *tmp_target[m]; - - if (k < 0 || m < 0) { - return -1; - } - - memset (tmp_source, 0, k); - memset (tmp_target, 0, m); - - for (i = 0; i < k; i++) { - tmp_source[i] = (unsigned char *) buffs[decode_index[i]]; - } - - for (i = 0; i < m; i++) { - if (i < errs) - tmp_target[i] = (unsigned char *) buffs[error_index[i]]; - } - - *source = tmp_source; - *target = tmp_target; - - return 0; -} - -/* - Generate decode matrix during the decoding phase -*/ - -int minio_init_decoder (int32_t *error_index, - int k, int n, int errs, - unsigned char *encode_matrix, - unsigned char **decode_matrix, - unsigned char **decode_tbls, - uint32_t **decode_index) -{ - int i, j, r, s, l, z; - unsigned char input_matrix[k * n]; - unsigned char inverse_matrix[k * n]; - unsigned char tmp_decode_matrix[k * n]; - unsigned char tmp_decode_tbls[k * n * 32]; - uint32_t tmp_decode_index[k]; - - for (i = 0, r = 0; i < k; i++, r++) { - while (_minio_src_index_in_error(r, error_index)) - r++; - for (j = 0; j < k; j++) { - input_matrix[k * i + j] = encode_matrix[k * r + j]; - } - tmp_decode_index[i] = r; - } - - // Not all vandermonde matrix can be inverted - if (gf_invert_matrix(input_matrix, inverse_matrix, k) < 0) { - return -1; - } - - for (l = 0; l < errs; l++) { - if (error_index[l] < k) { - // decoding matrix elements for data chunks - for (j = 0; j < k; j++) { - tmp_decode_matrix[k * l + j] = - inverse_matrix[k * - error_index[l] + j]; - } - } else { - int s = 0; - // decoding matrix element for coding chunks - for (i = 0; i < k; i++) { - s = 0; - for (j = 0; j < k; j++) { - s ^= gf_mul(inverse_matrix[j * k + i], - encode_matrix[k * - error_index[l] + j]); - } - tmp_decode_matrix[k * l + i] = s; - } - } - } - - ec_init_tables (k, errs, tmp_decode_matrix, tmp_decode_tbls); - - *decode_matrix = tmp_decode_matrix; - *decode_tbls = tmp_decode_tbls; - *decode_index = tmp_decode_index; - - return 0; -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_encode.c b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_encode.c deleted file mode 100644 index 8f90ef10a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_minio_encode.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, 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. - */ - -#include -#include - -#include "ec_isal-l.h" -#include "ec_minio_common.h" - -/* - Generate encode matrix during the encoding phase -*/ - -int32_t minio_init_encoder (int technique, int k, int m, - unsigned char **encode_matrix, - unsigned char **encode_tbls) -{ - size_t encode_matrix_size; - size_t encode_tbls_size; - unsigned char *tmp_matrix; - unsigned char *tmp_tbls; - - tmp_matrix = (unsigned char *) malloc (k * (k + m)); - tmp_tbls = (unsigned char *) malloc (k * (k + m) * 32); - - if (technique == 0) { - /* - Commonly used method for choosing coefficients in erasure - encoding but does not guarantee invertable for every sub - matrix. For large k it is possible to find cases where the - decode matrix chosen from sources and parity not in erasure - are not invertable. Users may want to adjust for k > 5. - -- Intel - */ - gf_gen_rs_matrix (tmp_matrix, k + m, k); - } else if (technique == 1) { - gf_gen_cauchy1_matrix (tmp_matrix, k + m, k); - } - - ec_init_tables(k, m, &tmp_matrix[k * k], tmp_tbls); - - *encode_matrix = tmp_matrix; - *encode_tbls = tmp_tbls; - - return 0; -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_multibinary.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_multibinary.asm deleted file mode 100644 index 910fdca8a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_multibinary.asm +++ /dev/null @@ -1,462 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define WRT_OPT wrt ..plt -%else - %define WRT_OPT -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define EC_ENCODE_DATA_SSE _ec_encode_data_sse - %define EC_ENCODE_DATA_AVX _ec_encode_data_avx - %define EC_ENCODE_DATA_AVX2 _ec_encode_data_avx2 - %define EC_ENCODE_DATA_BASE _ec_encode_data_base - %define EC_ENCODE_DATA _ec_encode_data - - %define EC_ENCODE_DATA_UPDATE_BASE _ec_encode_data_update_base - %define EC_ENCODE_DATA_UPDATE_SSE _ec_encode_data_update_sse - %define EC_ENCODE_DATA_UPDATE_AVX _ec_encode_data_update_avx - %define EC_ENCODE_DATA_UPDATE_AVX2 _ec_encode_data_update_avx2 - - %define GF_VECT_MAD_BASE _gf_vect_mad_base - %define GF_VECT_MAD_SSE _gf_vect_mad_sse - %define GF_VECT_MAD_AVX _gf_vect_mad_avx - %define GF_VECT_MAD_AVX2 _gf_vect_mad_avx2 - - %define GF_VECT_MUL_SSE _gf_vect_mul_sse - %define GF_VECT_MUL_AVX _gf_vect_mul_avx - %define GF_VECT_MUL_BASE _gf_vect_mul_base - %define GF_VECT_MUL _gf_vect_mul - - %define GF_VECT_DOT_PROD_SSE _gf_vect_dot_prod_sse - %define GF_VECT_DOT_PROD_AVX _gf_vect_dot_prod_avx - %define GF_VECT_DOT_PROD_AVX2 _gf_vect_dot_prod_avx2 - %define GF_VECT_DOT_PROD_BASE _gf_vect_dot_prod_base - %define GF_VECT_DOT_PROD _gf_vect_dot_prod - -%else - %define EC_ENCODE_DATA_SSE ec_encode_data_sse - %define EC_ENCODE_DATA_AVX ec_encode_data_avx - %define EC_ENCODE_DATA_AVX2 ec_encode_data_avx2 - %define EC_ENCODE_DATA_BASE ec_encode_data_base - %define EC_ENCODE_DATA ec_encode_data - - %define EC_ENCODE_DATA_UPDATE_BASE ec_encode_data_update_base - %define EC_ENCODE_DATA_UPDATE_SSE ec_encode_data_update_sse - %define EC_ENCODE_DATA_UPDATE_AVX ec_encode_data_update_avx - %define EC_ENCODE_DATA_UPDATE_AVX2 ec_encode_data_update_avx2 - - %define GF_VECT_MAD_BASE gf_vect_mad_base - %define GF_VECT_MAD_SSE gf_vect_mad_sse - %define GF_VECT_MAD_AVX gf_vect_mad_avx - %define GF_VECT_MAD_AVX2 gf_vect_mad_avx2 - - %define GF_VECT_MUL_SSE gf_vect_mul_sse - %define GF_VECT_MUL_AVX gf_vect_mul_avx - %define GF_VECT_MUL_BASE gf_vect_mul_base - %define GF_VECT_MUL gf_vect_mul - - %define GF_VECT_DOT_PROD_SSE gf_vect_dot_prod_sse - %define GF_VECT_DOT_PROD_AVX gf_vect_dot_prod_avx - %define GF_VECT_DOT_PROD_AVX2 gf_vect_dot_prod_avx2 - %define GF_VECT_DOT_PROD_BASE gf_vect_dot_prod_base - %define GF_VECT_DOT_PROD gf_vect_dot_prod - -%endif - -%include "ec_reg_sizes.asm" - -%ifidn __OUTPUT_FORMAT__, elf32 - -[bits 32] - - %define def_wrd dd - %define wrd_sz dword - %define arg1 esi - %define arg2 eax - %define arg3 ebx - %define arg4 ecx - %define arg5 edx - -%else - - default rel - [bits 64] - - %define def_wrd dq - %define wrd_sz qword - %define arg1 rsi - %define arg2 rax - %define arg3 rbx - %define arg4 rcx - %define arg5 rdx - - - extern EC_ENCODE_DATA_UPDATE_SSE - extern EC_ENCODE_DATA_UPDATE_AVX - extern EC_ENCODE_DATA_UPDATE_AVX2 - extern GF_VECT_MUL_SSE - extern GF_VECT_MUL_AVX - - extern GF_VECT_MAD_SSE - extern GF_VECT_MAD_AVX - extern GF_VECT_MAD_AVX2 -%endif - -extern GF_VECT_MUL_BASE -extern EC_ENCODE_DATA_BASE -extern EC_ENCODE_DATA_UPDATE_BASE -extern GF_VECT_DOT_PROD_BASE -extern GF_VECT_MAD_BASE - -extern GF_VECT_DOT_PROD_SSE -extern GF_VECT_DOT_PROD_AVX -extern GF_VECT_DOT_PROD_AVX2 -extern EC_ENCODE_DATA_SSE -extern EC_ENCODE_DATA_AVX -extern EC_ENCODE_DATA_AVX2 - - -section .data -;;; *_mbinit are initial values for *_dispatched; is updated on first call. -;;; Therefore, *_dispatch_init is only executed on first call. - -ec_encode_data_dispatched: - def_wrd ec_encode_data_mbinit - -gf_vect_mul_dispatched: - def_wrd gf_vect_mul_mbinit - -gf_vect_dot_prod_dispatched: - def_wrd gf_vect_dot_prod_mbinit - -ec_encode_data_update_dispatched: - def_wrd ec_encode_data_update_mbinit - -gf_vect_mad_dispatched: - def_wrd gf_vect_mad_mbinit - -section .text -;;;; -; ec_encode_data multibinary function -;;;; -global EC_ENCODE_DATA:function -ec_encode_data_mbinit: - call ec_encode_data_dispatch_init - -EC_ENCODE_DATA: - jmp wrd_sz [ec_encode_data_dispatched] - -ec_encode_data_dispatch_init: - push arg1 - push arg2 - push arg3 - push arg4 - push arg5 - lea arg1, [EC_ENCODE_DATA_BASE WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea arg3, [EC_ENCODE_DATA_SSE WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, arg3 - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea arg3, [EC_ENCODE_DATA_AVX WRT_OPT] - - jne _done_ec_encode_data_init - mov arg1, arg3 - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea arg3, [EC_ENCODE_DATA_AVX2 WRT_OPT] - cmovne arg1, arg3 - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_ec_encode_data_init - lea arg1, [EC_ENCODE_DATA_SSE WRT_OPT] - -_done_ec_encode_data_init: - pop arg5 - pop arg4 - pop arg3 - pop arg2 - mov [ec_encode_data_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_mul multibinary function -;;;; -global GF_VECT_MUL:function -gf_vect_mul_mbinit: - call gf_vect_mul_dispatch_init - -GF_VECT_MUL: - jmp wrd_sz [gf_vect_mul_dispatched] - -gf_vect_mul_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [GF_VECT_MUL_BASE] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [GF_VECT_MUL_BASE WRT_OPT] ; Default - - mov eax, 1 - cpuid - test ecx, FLAG_CPUID1_ECX_SSE4_2 - lea rbx, [GF_VECT_MUL_SSE WRT_OPT] - je _done_gf_vect_mul_dispatch_init - mov arg1, rbx - - ;; Try for AVX - and ecx, (FLAG_CPUID1_ECX_OSXSAVE | FLAG_CPUID1_ECX_AVX) - cmp ecx, (FLAG_CPUID1_ECX_OSXSAVE | FLAG_CPUID1_ECX_AVX) - jne _done_gf_vect_mul_dispatch_init - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - jne _done_gf_vect_mul_dispatch_init - lea arg1, [GF_VECT_MUL_AVX WRT_OPT] - -_done_gf_vect_mul_dispatch_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [gf_vect_mul_dispatched], arg1 - pop arg1 - ret - -;;;; -; ec_encode_data_update multibinary function -;;;; -global EC_ENCODE_DATA_UPDATE:function -ec_encode_data_update_mbinit: - call ec_encode_data_update_dispatch_init - -EC_ENCODE_DATA_UPDATE: - jmp wrd_sz [ec_encode_data_update_dispatched] - -ec_encode_data_update_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [ec_encode_data_update_base] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [EC_ENCODE_DATA_UPDATE_BASE WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea rbx, [EC_ENCODE_DATA_UPDATE_SSE WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, rbx - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea rbx, [EC_ENCODE_DATA_UPDATE_AVX WRT_OPT] - - jne _done_ec_encode_data_update_init - mov rsi, rbx - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea rbx, [EC_ENCODE_DATA_UPDATE_AVX2 WRT_OPT] - cmovne rsi, rbx - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_ec_encode_data_update_init - lea rsi, [EC_ENCODE_DATA_UPDATE_SSE WRT_OPT] - -_done_ec_encode_data_update_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [ec_encode_data_update_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_dot_prod multibinary function -;;;; -global GF_VECT_DOT_PROD:function -gf_vect_dot_prod_mbinit: - call gf_vect_dot_prod_dispatch_init - -GF_VECT_DOT_PROD: - jmp wrd_sz [gf_vect_dot_prod_dispatched] - -gf_vect_dot_prod_dispatch_init: - push arg1 - push arg2 - push arg3 - push arg4 - push arg5 - lea arg1, [GF_VECT_DOT_PROD_BASE WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea arg3, [GF_VECT_DOT_PROD_SSE WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, arg3 - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea arg3, [GF_VECT_DOT_PROD_AVX WRT_OPT] - - jne _done_gf_vect_dot_prod_init - mov arg1, arg3 - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea arg3, [GF_VECT_DOT_PROD_AVX2 WRT_OPT] - cmovne arg1, arg3 - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_gf_vect_dot_prod_init - lea arg1, [GF_VECT_DOT_PROD_SSE WRT_OPT] - -_done_gf_vect_dot_prod_init: - pop arg5 - pop arg4 - pop arg3 - pop arg2 - mov [gf_vect_dot_prod_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_mad multibinary function -;;;; -global GF_VECT_MAD:function -gf_vect_mad_mbinit: - call gf_vect_mad_dispatch_init - -GF_VECT_MAD: - jmp wrd_sz [gf_vect_mad_dispatched] - -gf_vect_mad_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [gf_vect_mad_base] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [GF_VECT_MAD_BASE WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea rbx, [GF_VECT_MAD_SSE WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, rbx - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea rbx, [GF_VECT_MAD_AVX WRT_OPT] - - jne _done_gf_vect_mad_init - mov rsi, rbx - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea rbx, [GF_VECT_MAD_AVX2 WRT_OPT] - cmovne rsi, rbx - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_gf_vect_mad_init - lea rsi, [GF_VECT_MAD_SSE WRT_OPT] - -_done_gf_vect_mad_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [gf_vect_mad_dispatched], arg1 - pop arg1 - ret - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro - -;;; func core, ver, snum -slversion EC_ENCODE_DATA, 00, 03, 0133 -slversion GF_VECT_MUL, 00, 02, 0134 -slversion EC_ENCODE_DATA_UPDATE, 00, 02, 0212 -slversion GF_VECT_DOT_PROD, 00, 02, 0138 -slversion GF_VECT_MAD, 00, 01, 0213 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_reg_sizes.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_reg_sizes.asm deleted file mode 100644 index 8a6f377d3..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_reg_sizes.asm +++ /dev/null @@ -1,96 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -%define EFLAGS_HAS_CPUID (1<<21) -%define FLAG_CPUID1_ECX_CLMUL (1<<1) -%define FLAG_CPUID1_EDX_SSE2 (1<<26) -%define FLAG_CPUID1_ECX_SSE3 (1) -%define FLAG_CPUID1_ECX_SSE4_1 (1<<19) -%define FLAG_CPUID1_ECX_SSE4_2 (1<<20) -%define FLAG_CPUID1_ECX_POPCNT (1<<23) -%define FLAG_CPUID1_ECX_AESNI (1<<25) -%define FLAG_CPUID1_ECX_OSXSAVE (1<<27) -%define FLAG_CPUID1_ECX_AVX (1<<28) -%define FLAG_CPUID1_EBX_AVX2 (1<<5) -%define FLAG_XGETBV_EAX_XMM_YMM 0x6 - -%define FLAG_CPUID1_EAX_AVOTON 0x000406d0 - -; define d and w variants for registers - -%define raxd eax -%define raxw ax -%define raxb al - -%define rbxd ebx -%define rbxw bx -%define rbxb bl - -%define rcxd ecx -%define rcxw cx -%define rcxb cl - -%define rdxd edx -%define rdxw dx -%define rdxb dl - -%define rsid esi -%define rsiw si -%define rsib sil - -%define rdid edi -%define rdiw di -%define rdib dil - -%define rbpd ebp -%define rbpw bp -%define rbpb bpl - -%define ymm0x xmm0 -%define ymm1x xmm1 -%define ymm2x xmm2 -%define ymm3x xmm3 -%define ymm4x xmm4 -%define ymm5x xmm5 -%define ymm6x xmm6 -%define ymm7x xmm7 -%define ymm8x xmm8 -%define ymm9x xmm9 -%define ymm10x xmm10 -%define ymm11x xmm11 -%define ymm12x xmm12 -%define ymm13x xmm13 -%define ymm14x xmm14 -%define ymm15x xmm15 - -%define DWORD(reg) reg %+ d -%define WORD(reg) reg %+ w -%define BYTE(reg) reg %+ b - -%define XWORD(reg) reg %+ x diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_types.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_types.h deleted file mode 100644 index 62e61e2dd..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/ec_types.h +++ /dev/null @@ -1,80 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - - -/** - * @file types.h - * @brief Defines standard width types. - * - */ - -#ifndef __TYPES_H -#define __TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(__unix__) && !defined(__APPLE__) -#ifdef __MINGW32__ -# include <_mingw.h> -#endif -typedef unsigned __int64 UINT64; -typedef __int64 INT64; -typedef unsigned __int32 UINT32; -typedef unsigned __int16 UINT16; -typedef unsigned char UINT8; -#else -typedef unsigned long int UINT64; -typedef long int INT64; -typedef unsigned int UINT32; -typedef unsigned short int UINT16; -typedef unsigned char UINT8; -#endif - - -#if defined(__unix__) || defined(__APPLE__) -# define DECLARE_ALIGNED(decl, alignval) decl __attribute__((aligned(alignval))) -# define __forceinline static inline -#else -# define DECLARE_ALIGNED(decl, alignval) __declspec(align(alignval)) decl -# define posix_memalign(p, algn, len) (NULL == (*((char**)(p)) = (void*) _aligned_malloc(len, algn))) -#endif - -#ifdef DEBUG -# define DEBUG_PRINT(x) printf x -#else -# define DEBUG_PRINT(x) do {} while (0) -#endif - -#ifdef __cplusplus -} -#endif - -#endif //__TYPES_H diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_decode.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_decode.go deleted file mode 100644 index 91c42ce1b..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_decode.go +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -// #cgo CFLAGS: -O0 -// #include -// #include "ec_isal-l.h" -// #include "ec_minio_common.h" -import "C" -import ( - "errors" - "fmt" - "unsafe" -) - -// Decode decodes erasure coded blocks of data into its original -// form. Erasure coded data contains K data blocks and M parity -// blocks. Decode can withstand data loss up to any M number of blocks. -// -// "encodedDataBlocks" is an array of K data blocks and M parity -// blocks. Data blocks are position and order dependent. Missing blocks -// are set to "nil". There must be at least "K" number of data|parity -// blocks. -// -// "dataLen" is the length of original source data -func (e *Erasure) Decode(encodedDataBlocks [][]byte, dataLen int) (decodedData []byte, err error) { - var source, target **C.uchar - - k := int(e.params.K) - m := int(e.params.M) - n := k + m - // We need the data and parity blocks preserved in the same order. Missing blocks are set to nil. - if len(encodedDataBlocks) != n { - msg := fmt.Sprintf("Encoded data blocks slice must of length [%d]", n) - return nil, errors.New(msg) - } - - // Length of a single encoded block - encodedBlockLen := GetEncodedBlockLen(dataLen, uint8(k)) - - // Keep track of errors per block. - missingEncodedBlocks := make([]int, n+1) - var missingEncodedBlocksCount int - - // Check for the missing encoded blocks - for i := range encodedDataBlocks { - if encodedDataBlocks[i] == nil || len(encodedDataBlocks[i]) == 0 { - missingEncodedBlocks[missingEncodedBlocksCount] = i - missingEncodedBlocksCount++ - } - } - missingEncodedBlocks[missingEncodedBlocksCount] = -1 - missingEncodedBlocksCount++ - - // Cannot reconstruct original data. Need at least M number of data or parity blocks. - if missingEncodedBlocksCount-1 > m { - return nil, fmt.Errorf("Cannot reconstruct original data. Need at least [%d] data or parity blocks", m) - } - - // Convert from Go int slice to C int array - missingEncodedBlocksC := intSlice2CIntArray(missingEncodedBlocks[:missingEncodedBlocksCount]) - - // Allocate buffer for the missing blocks - for i := range encodedDataBlocks { - if encodedDataBlocks[i] == nil || len(encodedDataBlocks[i]) == 0 { - encodedDataBlocks[i] = make([]byte, encodedBlockLen) - } - } - - // If not already initialized, recompute and cache - if e.decodeMatrix == nil || e.decodeTbls == nil || e.decodeIndex == nil { - var decodeMatrix, decodeTbls *C.uchar - var decodeIndex *C.uint32_t - - C.minio_init_decoder(missingEncodedBlocksC, C.int(k), C.int(n), C.int(missingEncodedBlocksCount-1), - e.encodeMatrix, &decodeMatrix, &decodeTbls, &decodeIndex) - - // cache this for future needs - e.decodeMatrix = decodeMatrix - e.decodeTbls = decodeTbls - e.decodeIndex = decodeIndex - } - - // Make a slice of pointers to encoded blocks. Necessary to bridge to the C world. - pointers := make([]*byte, n) - for i := range encodedDataBlocks { - pointers[i] = &encodedDataBlocks[i][0] - } - - // Get pointers to source "data" and target "parity" blocks from the output byte array. - ret := C.minio_get_source_target(C.int(missingEncodedBlocksCount-1), C.int(k), C.int(m), missingEncodedBlocksC, - e.decodeIndex, (**C.uchar)(unsafe.Pointer(&pointers[0])), &source, &target) - if int(ret) == -1 { - return nil, errors.New("Unable to decode data") - } - - // Decode data - C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(missingEncodedBlocksCount-1), e.decodeTbls, - source, target) - - // Allocate buffer to output buffer - decodedData = make([]byte, 0, encodedBlockLen*int(k)) - for i := 0; i < int(k); i++ { - decodedData = append(decodedData, encodedDataBlocks[i]...) - } - - return decodedData[:dataLen], nil -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_encode.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_encode.go deleted file mode 100644 index 5088edfbb..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_encode.go +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -// #cgo CFLAGS: -O0 -// #include -// #include "ec_isal-l.h" -// #include "ec_minio_common.h" -import "C" -import ( - "errors" - "unsafe" -) - -// Technique - type of matrix type used in encoding -type Technique uint8 - -// Different types of supported matrix types -const ( - Vandermonde Technique = iota - Cauchy - None -) - -// Default Data and Parity blocks -const ( - K = 10 - M = 3 -) - -// Block alignment -const ( - SIMDAlign = 32 -) - -// ErasureParams is a configuration set for building an encoder. It is created using ValidateParams(). -type ErasureParams struct { - K uint8 - M uint8 - Technique Technique // cauchy or vandermonde matrix (RS) -} - -// Erasure is an object used to encode and decode data. -type Erasure struct { - params *ErasureParams - encodeMatrix, encodeTbls *C.uchar - decodeMatrix, decodeTbls *C.uchar - decodeIndex *C.uint32_t -} - -// ValidateParams creates an ErasureParams object. -// -// k and m represent the matrix size, which corresponds to the protection level -// technique is the matrix type. Valid inputs are Cauchy (recommended) or Vandermonde. -// -func ValidateParams(k, m uint8, technique Technique) (*ErasureParams, error) { - if k < 1 { - return nil, errors.New("k cannot be zero") - } - - if m < 1 { - return nil, errors.New("m cannot be zero") - } - - if k+m > 255 { - return nil, errors.New("(k + m) cannot be bigger than Galois field GF(2^8) - 1") - } - - switch technique { - case Vandermonde: - break - case Cauchy: - break - default: - return nil, errors.New("Technique can be either vandermonde or cauchy") - } - - return &ErasureParams{ - K: k, - M: m, - Technique: technique, - }, nil -} - -// NewErasure creates an encoder object with a given set of parameters. -func NewErasure(ep *ErasureParams) *Erasure { - var k = C.int(ep.K) - var m = C.int(ep.M) - - var encodeMatrix *C.uchar - var encodeTbls *C.uchar - - C.minio_init_encoder(C.int(ep.Technique), k, m, &encodeMatrix, - &encodeTbls) - - return &Erasure{ - params: ep, - encodeMatrix: encodeMatrix, - encodeTbls: encodeTbls, - decodeMatrix: nil, - decodeTbls: nil, - decodeIndex: nil, - } -} - -// GetEncodedBlocksLen - total length of all encoded blocks -func GetEncodedBlocksLen(inputLen int, k, m uint8) (outputLen int) { - outputLen = GetEncodedBlockLen(inputLen, k) * int(k+m) - return outputLen -} - -// GetEncodedBlockLen - length per block of encoded blocks -func GetEncodedBlockLen(inputLen int, k uint8) (encodedOutputLen int) { - alignment := int(k) * SIMDAlign - remainder := inputLen % alignment - - paddedInputLen := inputLen - if remainder != 0 { - paddedInputLen = inputLen + (alignment - remainder) - } - encodedOutputLen = paddedInputLen / int(k) - return encodedOutputLen -} - -// Encode erasure codes a block of data in "k" data blocks and "m" parity blocks. -// Output is [k+m][]blocks of data and parity slices. -func (e *Erasure) Encode(inputData []byte) (encodedBlocks [][]byte, err error) { - k := int(e.params.K) // "k" data blocks - m := int(e.params.M) // "m" parity blocks - n := k + m // "n" total encoded blocks - - // Length of a single encoded chunk. - // Total number of encoded chunks = "k" data + "m" parity blocks - encodedBlockLen := GetEncodedBlockLen(len(inputData), uint8(k)) - - // Length of total number of "k" data chunks - encodedDataBlocksLen := encodedBlockLen * k - - // Length of extra padding required for the data blocks. - encodedDataBlocksPadLen := encodedDataBlocksLen - len(inputData) - - // Extend inputData buffer to accommodate coded data blocks if necesssary - if encodedDataBlocksPadLen > 0 { - padding := make([]byte, encodedDataBlocksPadLen) - // Expand with new padded blocks to the byte array - inputData = append(inputData, padding...) - } - - // Extend inputData buffer to accommodate coded parity blocks - { // Local Scope - encodedParityBlocksLen := encodedBlockLen * m - parityBlocks := make([]byte, encodedParityBlocksLen) - inputData = append(inputData, parityBlocks...) - } - - // Allocate memory to the "encoded blocks" return buffer - encodedBlocks = make([][]byte, n) // Return buffer - - // Nessary to bridge Go to the C world. C requires 2D arry of pointers to - // byte array. "encodedBlocks" is a 2D slice. - pointersToEncodedBlock := make([]*byte, n) // Pointers to encoded blocks. - - // Copy data block slices to encoded block buffer - for i := 0; i < k; i++ { - encodedBlocks[i] = inputData[i*encodedBlockLen : (i+1)*encodedBlockLen] - pointersToEncodedBlock[i] = &encodedBlocks[i][0] - } - - // Copy erasure block slices to encoded block buffer - for i := k; i < n; i++ { - encodedBlocks[i] = make([]byte, encodedBlockLen) - pointersToEncodedBlock[i] = &encodedBlocks[i][0] - } - - // Erasure code the data into K data blocks and M parity - // blocks. Only the parity blocks are filled. Data blocks remain - // intact. - C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(m), e.encodeTbls, - (**C.uchar)(unsafe.Pointer(&pointersToEncodedBlock[:k][0])), // Pointers to data blocks - (**C.uchar)(unsafe.Pointer(&pointersToEncodedBlock[k:][0]))) // Pointers to parity blocks - - return encodedBlocks, nil -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_darwin.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_darwin.go deleted file mode 100644 index 55380b0e2..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_darwin.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f macho64 ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f macho64 gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f macho64 gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f macho64 gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f macho64 gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f macho64 gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f macho64 gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f macho64 gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f macho64 gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f macho64 gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f macho64 gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f macho64 gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f macho64 gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f macho64 gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f macho64 gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f macho64 gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f macho64 gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f macho64 gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_linux.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_linux.go deleted file mode 100644 index 0574a7ccc..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_linux.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f elf64 ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f elf64 gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f elf64 gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f elf64 gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f elf64 gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f elf64 gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f elf64 gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f elf64 gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f elf64 gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f elf64 gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f elf64 gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f elf64 gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f elf64 gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f elf64 gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_windows.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_windows.go deleted file mode 100644 index c3aa6f0de..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/erasure_yasm_windows.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f win64 ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f win64 gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f win64 gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f win64 gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f win64 gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f win64 gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f win64 gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f win64 gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f win64 gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f win64 gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f win64 gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f win64 gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f win64 gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f win64 gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f win64 gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f win64 gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f win64 gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f win64 gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f win64 gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f win64 gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx.asm deleted file mode 100644 index 8dcc3382f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx.asm +++ /dev/null @@ -1,381 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_DOT_PROD_AVX _gf_2vect_dot_prod_avx -%else - %define GF_2VECT_DOT_PROD_AVX gf_2vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm8 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xmm5 - %define xgft2_hi xmm4 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%else ;32-bit code - %define xmask0f xmm4 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%endif - -align 16 -global GF_2VECT_DOT_PROD_AVX:function - -func(GF_2VECT_DOT_PROD_AVX) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16 - vpxor xp1, xp1 - vpxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_DOT_PROD_AVX, 02, 04, 0191 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx2.asm deleted file mode 100644 index 583ce7416..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_avx2.asm +++ /dev/null @@ -1,398 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_DOT_PROD_AVX2 _gf_2vect_dot_prod_avx2 -%else - %define GF_2VECT_DOT_PROD_AVX2 gf_2vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - -%ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else - -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm8 - %define xmask0fx xmm8 - %define xgft1_lo ymm7 - %define xgft1_hi ymm6 - %define xgft2_lo ymm5 - %define xgft2_hi ymm4 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 -%else ;32-bit code - %define xmask0f ymm7 - %define xmask0fx xmm7 - %define xgft1_lo ymm5 - %define xgft1_hi ymm4 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - -%endif - -align 16 -global GF_2VECT_DOT_PROD_AVX2:function - -func(GF_2VECT_DOT_PROD_AVX2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32 - vpxor xp1, xp1 - vpxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - %else - XLDR x0, [ptr+pos] ;Get next source vector - %endif - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_DOT_PROD_AVX2, 04, 04, 0196 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_sse.asm deleted file mode 100644 index 5237314c6..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_dot_prod_sse.asm +++ /dev/null @@ -1,383 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_DOT_PROD_SSE _gf_2vect_dot_prod_sse -%else - %define GF_2VECT_DOT_PROD_SSE gf_2vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm8 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xmm5 - %define xgft2_hi xmm4 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%else ;32-bit code - %define xmask0f xmm4 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%endif - -align 16 -global GF_2VECT_DOT_PROD_SSE:function - -func(GF_2VECT_DOT_PROD_SSE) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16 - pxor xp1, xp1 - pxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ;64-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_DOT_PROD_SSE, 00, 03, 0062 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx.asm deleted file mode 100644 index 9542e7e6b..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx.asm +++ /dev/null @@ -1,264 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_MAD_AVX _gf_2vect_mad_avx -%else - %define GF_2VECT_MAD_AVX gf_2vect_mad_avx -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm14 -%define xgft1_lo xmm13 -%define xgft1_hi xmm12 -%define xgft2_lo xmm11 -%define xgft2_hi xmm10 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xd1 xmm6 -%define xd2 xmm7 -%define xtmpd1 xmm8 -%define xtmpd2 xmm9 - - -align 16 -global GF_2VECT_MAD_AVX:function - -func(GF_2VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - - mov dest2, [dest1+PS] - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop16 - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - vmovdqa xd1, xtmpd1 ;Restore xd1 - vmovdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_MAD_AVX, 02, 00, 0204 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx2.asm deleted file mode 100644 index a6a2253ea..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_avx2.asm +++ /dev/null @@ -1,280 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_MAD_AVX2 _gf_2vect_mad_avx2 -%else - %define GF_2VECT_MAD_AVX2 gf_2vect_mad_avx2 -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else - -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm14 -%define xmask0fx xmm14 -%define xgft1_lo ymm13 -%define xgft1_hi ymm12 -%define xgft2_lo ymm11 -%define xgft2_hi ymm10 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph1 ymm2 -%define xtmpl1 ymm3 -%define xtmph2 ymm4 -%define xtmpl2 ymm5 -%define xd1 ymm6 -%define xd2 ymm7 -%define xtmpd1 ymm8 -%define xtmpd2 ymm9 - -align 16 -global GF_2VECT_MAD_AVX2:function - -func(GF_2VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - mov dest2, [dest1+PS] ; reuse mul_array - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop32 - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop32_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - vmovdqa xd1, xtmpd1 ;Restore xd1 - vmovdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop32_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_MAD_AVX2, 04, 00, 0205 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_sse.asm deleted file mode 100644 index af1b0c0d5..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_2vect_mad_sse.asm +++ /dev/null @@ -1,267 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_2VECT_MAD_SSE _gf_2vect_mad_sse -%else - %define GF_2VECT_MAD_SSE gf_2vect_mad_sse -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm14 -%define xgft1_lo xmm13 -%define xgft1_hi xmm12 -%define xgft2_lo xmm11 -%define xgft2_hi xmm10 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xd1 xmm6 -%define xd2 xmm7 -%define xtmpd1 xmm8 -%define xtmpd2 xmm9 - - -align 16 -global GF_2VECT_MAD_SSE:function -func(GF_2VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - movdqu xgft1_lo,[tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - mov dest2, [dest1+PS] - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph1, xgft1_hi ;Reload const array registers - movdqa xtmpl1, xgft1_lo - movdqa xtmph2, xgft2_hi ;Reload const array registers - movdqa xtmpl2, xgft2_lo - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - movdqa xd1, xtmpd1 ;Restore xd1 - movdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_2VECT_MAD_SSE, 00, 00, 0203 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx.asm deleted file mode 100644 index 70a468f25..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx.asm +++ /dev/null @@ -1,421 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_DOT_PROD_AVX _gf_3vect_dot_prod_avx -%else - %define GF_3VECT_DOT_PROD_AVX gf_3vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm11 - %define xgft1_lo xmm10 - %define xgft1_hi xmm9 - %define xgft2_lo xmm8 - %define xgft2_hi xmm7 - %define xgft3_lo xmm6 - %define xgft3_hi xmm5 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%else - %define xmask0f xmm7 - %define xgft1_lo xmm6 - %define xgft1_hi xmm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%endif - -align 16 -global GF_3VECT_DOT_PROD_AVX:function -func(GF_3VECT_DOT_PROD_AVX) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_DOT_PROD_AVX, 02, 04, 0192 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx2.asm deleted file mode 100644 index 469a41098..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_avx2.asm +++ /dev/null @@ -1,441 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_DOT_PROD_AVX2 _gf_3vect_dot_prod_avx2 -%else - %define GF_3VECT_DOT_PROD_AVX2 gf_3vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - -%ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm11 - %define xmask0fx xmm11 - %define xgft1_lo ymm10 - %define xgft1_hi ymm9 - %define xgft2_lo ymm8 - %define xgft2_hi ymm7 - %define xgft3_lo ymm6 - %define xgft3_hi ymm5 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 -%else - %define xmask0f ymm7 - %define xmask0fx xmm7 - %define xgft1_lo ymm6 - %define xgft1_hi ymm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - -%endif - -align 16 -global GF_3VECT_DOT_PROD_AVX2:function -func(GF_3VECT_DOT_PROD_AVX2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_DOT_PROD_AVX2, 04, 04, 0197 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_sse.asm deleted file mode 100644 index bd0ae4f5f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_dot_prod_sse.asm +++ /dev/null @@ -1,422 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_DOT_PROD_SSE _gf_3vect_dot_prod_sse -%else - %define GF_3VECT_DOT_PROD_SSE gf_3vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm11 - %define xgft1_lo xmm2 - %define xgft1_hi xmm3 - %define xgft2_lo xmm4 - %define xgft2_hi xmm7 - %define xgft3_lo xmm6 - %define xgft3_hi xmm5 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm10 - %define xp2 xmm9 - %define xp3 xmm8 -%else - %define xmask0f xmm7 - %define xgft1_lo xmm6 - %define xgft1_hi xmm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%endif - -align 16 -global GF_3VECT_DOT_PROD_SSE:function -func(GF_3VECT_DOT_PROD_SSE) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ;64-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - movdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_DOT_PROD_SSE, 00, 05, 0063 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx.asm deleted file mode 100644 index f3cabd68e..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx.asm +++ /dev/null @@ -1,315 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_MAD_AVX _gf_3vect_mad_avx -%else - %define GF_3VECT_MAD_AVX gf_3vect_mad_avx -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - vmovdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - vmovdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - -align 16 -global GF_3VECT_MAD_AVX:function -func(GF_3VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft3_hi, [tmp+2*vec+16]; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ; dest2 - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - vpinsrb xtmpl3, xtmpl3, len.w, 15 - vpshufb xtmpl3, xtmpl3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xgft1_hi, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_hi, xgft1_lo ;GF add high and low partials - vpand xgft1_hi, xgft1_hi, xtmpl3 - vpxor xd1, xd1, xgft1_hi - - ; dest2 - vpshufb xgft2_hi, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_hi, xgft2_lo ;GF add high and low partials - vpand xgft2_hi, xgft2_hi, xtmpl3 - vpxor xd2, xd2, xgft2_hi - - ; dest3 - vpshufb xgft3_hi, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_hi, xgft3_lo ;GF add high and low partials - vpand xgft3_hi, xgft3_hi, xtmpl3 - vpxor xd3, xd3, xgft3_hi - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_MAD_AVX, 02, 00, 0207 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx2.asm deleted file mode 100644 index 092538000..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_avx2.asm +++ /dev/null @@ -1,347 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_MAD_AVX2 _gf_3vect_mad_avx2 -%else - %define GF_3VECT_MAD_AVX2 gf_3vect_mad_avx2 -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - vmovdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - vmovdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size - %endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft3_lo ymm11 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph1 ymm2 -%define xtmpl1 ymm3 -%define xtmph2 ymm4 -%define xtmpl2 ymm5 -%define xtmpl2x xmm5 -%define xtmph3 ymm6 -%define xtmpl3 ymm7 -%define xtmpl3x xmm7 -%define xd1 ymm8 -%define xd2 ymm9 -%define xd3 ymm10 - -align 16 -global GF_3VECT_MAD_AVX2:function -func(GF_3VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xtmpl2, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xtmpl3, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmpl2x, xtmpl2x, tmp.w, 0 - vpbroadcastb xtmpl2, xtmpl2x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph3, [constip32] ;Load const of i + 32 - vpinsrb xtmpl3x, xtmpl3x, len.w, 15 - vinserti128 xtmpl3, xtmpl3, xtmpl3x, 1 ;swapped to xtmpl3x | xtmpl3x - vpshufb xtmpl3, xtmpl3, xtmpl2 ;Broadcast len to all bytes. xtmpl2=0x1f1f1f... - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl3 - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl3 - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xgft3_lo ;GF add high and low partials - vpand xtmph3, xtmph3, xtmpl3 - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_MAD_AVX2, 04, 00, 0208 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_sse.asm deleted file mode 100644 index c011eba8a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_3vect_mad_sse.asm +++ /dev/null @@ -1,326 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_3VECT_MAD_SSE _gf_3vect_mad_sse -%else - %define GF_3VECT_MAD_SSE gf_3vect_mad_sse -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - -align 16 -global GF_3VECT_MAD_SSE:function -func(GF_3VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft3_hi, [tmp+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph1, xgft1_hi ;Reload const array registers - movdqa xtmpl1, xgft1_lo - movdqa xtmph2, xgft2_hi ;Reload const array registers - movdqa xtmpl2, xgft2_lo - movdqa xtmph3, xgft3_hi ;Reload const array registers - movdqa xtmpl3, xgft3_lo - - XLDR xd1, [dest1+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - pinsrb xtmpl3, len.w, 15 - pshufb xtmpl3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmpl3, xtmph3 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pand xgft1_hi, xtmpl3 - pxor xd1, xgft1_hi - - ; dest2 - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pand xgft2_hi, xtmpl3 - pxor xd2, xgft2_hi - - ; dest3 - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pand xgft3_hi, xtmpl3 - pxor xd3, xgft3_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xd3 ;Store result - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_3VECT_MAD_SSE, 00, 00, 0206 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx.asm deleted file mode 100644 index 49c882948..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx.asm +++ /dev/null @@ -1,489 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_DOT_PROD_AVX _gf_4vect_dot_prod_avx -%else - %define GF_4VECT_DOT_PROD_AVX gf_4vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm14 - %define xgft1_lo xmm13 - %define xgft1_hi xmm12 - %define xgft2_lo xmm11 - %define xgft2_hi xmm10 - %define xgft3_lo xmm9 - %define xgft3_hi xmm8 - %define xgft4_lo xmm7 - %define xgft4_hi xmm6 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%else - %define xmm_trans xmm7 ;reuse xmask0f and xgft1_lo - %define xmask0f xmm_trans - %define xgft1_lo xmm_trans - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%endif -align 16 -global GF_4VECT_DOT_PROD_AVX:function -func(GF_4VECT_DOT_PROD_AVX) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - %ifidn PS,8 ;64-bit code - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - %else ;32-bit code - XLDR x0, [ptr+pos] ;Get next source vector - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %endif - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ;32-bit code - SLDR vskip3, vskip3_m - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_DOT_PROD_AVX, 02, 04, 0193 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx2.asm deleted file mode 100644 index 7c835e0b1..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_avx2.asm +++ /dev/null @@ -1,510 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_DOT_PROD_AVX2 _gf_4vect_dot_prod_avx2 -%else - %define GF_4VECT_DOT_PROD_AVX2 gf_4vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm14 - %define xmask0fx xmm14 - %define xgft1_lo ymm13 - %define xgft1_hi ymm12 - %define xgft2_lo ymm11 - %define xgft2_hi ymm10 - %define xgft3_lo ymm9 - %define xgft3_hi ymm8 - %define xgft4_lo ymm7 - %define xgft4_hi ymm6 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - %define xp4 ymm5 -%else - %define ymm_trans ymm7 ;reuse xmask0f and xgft1_hi - %define xmask0f ymm_trans - %define xmask0fx xmm7 - %define xgft1_lo ymm6 - %define xgft1_hi ymm_trans - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - %define xp4 ymm5 -%endif -align 16 -global GF_4VECT_DOT_PROD_AVX2:function -func(GF_4VECT_DOT_PROD_AVX2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - - add vec_i, PS - %ifidn PS,8 ;64-bit code - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - %else ;32-bit code - mov cl, 0x0f ;use ecx as a temp variable - vpinsrb xmask0fx, xmask0fx, ecx, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - %endif - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - sar vec, 1 - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ; 32-bit code - SLDR vskip3, vskip3_m - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " DX{00}, Dx{10}, ..., Dx{f0} - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - %endif - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_DOT_PROD_AVX2, 04, 04, 0198 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_sse.asm deleted file mode 100644 index 59432e05d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_dot_prod_sse.asm +++ /dev/null @@ -1,491 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_DOT_PROD_SSE _gf_4vect_dot_prod_sse -%else - %define GF_4VECT_DOT_PROD_SSE gf_4vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm14 - %define xgft1_lo xmm2 - %define xgft1_hi xmm3 - %define xgft2_lo xmm11 - %define xgft2_hi xmm4 - %define xgft3_lo xmm9 - %define xgft3_hi xmm5 - %define xgft4_lo xmm7 - %define xgft4_hi xmm6 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm8 - %define xp2 xmm10 - %define xp3 xmm12 - %define xp4 xmm13 -%else - %define xmm_trans xmm7 ;reuse xmask0f and xgft1_lo - %define xmask0f xmm_trans - %define xgft1_lo xmm_trans - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%endif -align 16 -global GF_4VECT_DOT_PROD_SSE:function -func(GF_4VECT_DOT_PROD_SSE) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - %ifidn PS,8 ;64-bit code - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - %else ;32-bit code - XLDR x0, [ptr+pos] ;Get next source vector - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %endif - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - movdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - %endif - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ;32-bit code - SLDR vskip3, vskip3_m - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_DOT_PROD_SSE, 00, 05, 0064 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx.asm deleted file mode 100644 index af35d6704..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx.asm +++ /dev/null @@ -1,370 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_MAD_AVX _gf_4vect_mad_avx -%else - %define GF_4VECT_MAD_AVX gf_4vect_mad_avx -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 2*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_4vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft3_hi xmm14 -%define xgft4_hi xmm13 -%define xgft4_lo xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph4 xmm8 -%define xtmpl4 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmph1 -%define xd4 xtmpl1 - -align 16 -global GF_4VECT_MAD_AVX:function -func(GF_4VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - mov tmp, vec - - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - - sal tmp, 6 ;Multiply by 64 - vmovdqu xgft3_hi, [tmp3+tmp+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - vmovdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - vmovdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmph1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmpl1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - ; dest3 - vpshufb xtmph3, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xtmph4, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl4, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xtmpl4 ;GF add high and low partials - vpxor xd4, xd4, xtmph4 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - XSTR [dest4+pos], xd4 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xtmph4, [dest3+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmpl4, [constip16] ;Load const of i + 16 - vpinsrb xtmph3, xtmph3, len.w, 15 - vpshufb xtmph3, xtmph3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmph3, xtmph3, xtmpl4 - - XLDR xtmpl4, [dest4+tmp] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmph3 - vpxor xd1, xd1, xtmph1 - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpand xtmph2, xtmph2, xtmph3 - vpxor xd2, xd2, xtmph2 - - ; dest3 - vpshufb xgft3_hi, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_hi, xtmpl3 ;GF add high and low partials - vpand xgft3_hi, xgft3_hi, xtmph3 - vpxor xtmph4, xtmph4, xgft3_hi - - ; dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmph3 - vpxor xtmpl4, xtmpl4, xgft4_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xtmph4 ;Store result - XSTR [dest4+tmp], xtmpl4 ;Store result - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_MAD_AVX, 02, 00, 020a diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx2.asm deleted file mode 100644 index 8ea779af2..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_avx2.asm +++ /dev/null @@ -1,371 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_MAD_AVX2 _gf_4vect_mad_avx2 -%else - %define GF_4VECT_MAD_AVX2 gf_4vect_mad_avx2 -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - - -;;; gf_4vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph1 ymm3 -%define xtmph1x xmm3 -%define xtmph2 ymm4 -%define xtmph3 ymm5 -%define xtmph4 ymm6 -%define xd1 ymm7 -%define xd2 ymm8 -%define xd3 ymm9 -%define xd4 ymm10 - -align 16 -global GF_4VECT_MAD_AVX2:function -func(GF_4VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - add tmp, vec - vmovdqu xgft4_lo, [tmp+2*vec] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;reuse xtmpl1. Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph4, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - ; dest4 - vpshufb xtmph4, xtmph4, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph4 ;xd4 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - XSTR [dest4+pos], xd4 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmph1x, xtmph1x, tmp.w, 0 - vpbroadcastb xtmph1, xtmph1x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph2, [constip32] ;Load const of i + 32 - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph1 ;Broadcast len to all bytes. xtmph1=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, xtmph2 - - vpand xtmph1, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vperm2i128 xtmpa, xtmph1, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph1, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph4, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft1_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xgft3_lo ;GF add high and low partials - vpand xtmph3, xtmph3, xtmpl - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - ; dest4 - vpshufb xtmph4, xtmph4, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xgft4_lo ;GF add high and low partials - vpand xtmph4, xtmph4, xtmpl - vpxor xd4, xd4, xtmph4 ;xd4 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - XSTR [dest4+tmp], xd4 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_MAD_AVX2, 04, 00, 020b diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_sse.asm deleted file mode 100644 index 9f0bc4165..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_4vect_mad_sse.asm +++ /dev/null @@ -1,375 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_4VECT_MAD_SSE _gf_4vect_mad_sse -%else - %define GF_4VECT_MAD_SSE gf_4vect_mad_sse -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 2*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_4vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft3_hi xmm14 -%define xgft4_hi xmm13 -%define xgft4_lo xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph4 xmm8 -%define xtmpl4 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmph1 -%define xd4 xtmpl1 - -align 16 -global GF_4VECT_MAD_SSE:function -func(GF_4VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - - sal tmp, 6 ;Multiply by 64 - - movdqu xgft3_hi, [tmp3+tmp+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - movdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - movdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - movdqa xtmph3, xgft3_hi - movdqa xtmpl4, xgft4_lo - movdqa xtmph4, xgft4_hi - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmph1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmpl1, Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - ; dest4 - pshufb xtmph4, x0 ;Lookup mul table of high nibble - pshufb xtmpl4, xtmpa ;Lookup mul table of low nibble - pxor xtmph4, xtmpl4 ;GF add high and low partials - pxor xd4, xtmph4 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - XSTR [dest4+pos], xd4 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xtmph4, [dest3+tmp] ;Reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmpl4, [constip16] ;Load const of i + 16 - pinsrb xtmph3, len.w, 15 - pshufb xtmph3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmph3, xtmpl4 - - XLDR xtmpl4, [dest4+tmp] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pand xtmph1, xtmph3 - pxor xd1, xtmph1 - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pand xtmph2, xtmph3 - pxor xd2, xtmph2 - - ; dest3 - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xtmpl3 ;GF add high and low partials - pand xgft3_hi, xtmph3 - pxor xtmph4, xgft3_hi - - ; dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmph3 - pxor xtmpl4, xgft4_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xtmph4 ;Store result - XSTR [dest4+tmp], xtmpl4 ;Store result - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_4VECT_MAD_SSE, 00, 00, 0209 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx.asm deleted file mode 100644 index 4291b8ea5..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx.asm +++ /dev/null @@ -1,348 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_DOT_PROD_AVX _gf_5vect_dot_prod_avx -%else - %define GF_5VECT_DOT_PROD_AVX gf_5vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 -%define xgft4_lo xmm8 -%define xgft4_hi xmm7 - - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm2 -%define xp2 xmm3 -%define xp3 xmm4 -%define xp4 xmm5 -%define xp5 xmm6 - -align 16 -global GF_5VECT_DOT_PROD_AVX:function -func(GF_5VECT_DOT_PROD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vmovdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft1_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, 32 - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_DOT_PROD_AVX, 02, 03, 0194 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx2.asm deleted file mode 100644 index 5dcbd3740..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_avx2.asm +++ /dev/null @@ -1,362 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_DOT_PROD_AVX2 _gf_5vect_dot_prod_avx2 -%else - %define GF_5VECT_DOT_PROD_AVX2 gf_5vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - vmovdqa [rsp + 9*16], xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft2_hi ymm11 -%define xgft3_lo ymm10 -%define xgft3_hi ymm9 -%define xgft4_lo ymm8 -%define xgft4_hi ymm7 - - -%define x0 ymm0 -%define xtmpa ymm1 -%define xp1 ymm2 -%define xp2 ymm3 -%define xp3 ymm4 -%define xp4 ymm5 -%define xp5 ymm6 - -align 16 -global GF_5VECT_DOT_PROD_AVX2:function -func(GF_5VECT_DOT_PROD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop32: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - add vec_i, PS - - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vmovdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_DOT_PROD_AVX2, 04, 03, 0199 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_sse.asm deleted file mode 100644 index ac3f65f28..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_dot_prod_sse.asm +++ /dev/null @@ -1,349 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_DOT_PROD_SSE _gf_5vect_dot_prod_sse -%else - %define GF_5VECT_DOT_PROD_SSE gf_5vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - movdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm2 -%define xgft1_hi xmm3 -%define xgft2_lo xmm4 -%define xgft2_hi xmm5 -%define xgft3_lo xmm10 -%define xgft3_hi xmm6 -%define xgft4_lo xmm8 -%define xgft4_hi xmm7 - - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm9 -%define xp2 xmm11 -%define xp3 xmm12 -%define xp4 xmm13 -%define xp5 xmm14 - -align 16 -global GF_5VECT_DOT_PROD_SSE:function -func(GF_5VECT_DOT_PROD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - pxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - movdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft1_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, 32 - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pxor xp4, xgft4_hi ;xp4 += partial - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_DOT_PROD_SSE, 00, 04, 0065 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx.asm deleted file mode 100644 index 427662d8d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx.asm +++ /dev/null @@ -1,401 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_MAD_AVX _gf_5vect_mad_avx -%else - %define GF_5VECT_MAD_AVX gf_5vect_mad_avx -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_5vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 mul_array -%define dest4 tmp2 -%define dest5 vec_i - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft5_hi xmm14 -%define xgft4_lo xmm13 -%define xgft4_hi xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph5 xmm8 -%define xtmpl5 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmpl1 -%define xd4 xtmph1 -%define xd5 xtmpl2 - - -align 16 -global GF_5VECT_MAD_AVX:function -func(GF_5VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - vmovdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - vmovdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - vmovdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmph1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - XLDR xd5, [dest5+pos] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xtmph2, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl3 ;GF add high and low partials - vpxor xd4, xd4, xtmph2 - - ; dest5 - vpshufb xtmph5, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl5, xtmpl5, xtmpa ;Lookup mul table of low nibble - vpxor xtmph5, xtmph5, xtmpl5 ;GF add high and low partials - vpxor xd5, xd5, xtmph5 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - - sub len, pos - - vmovdqa xtmph1, [constip16] ;Load const of i + 16 - vpinsrb xtmph5, len.w, 15 - vpshufb xtmph5, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmph5, xtmph5, xtmph1 - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmph5 - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+tmp] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+tmp] ;Reuse xtmph1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpand xtmph2, xtmph2, xtmph5 - vpxor xd2, xd2, xtmph2 - - XLDR xd5, [dest5+tmp] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpand xtmph3, xtmph3, xtmph5 - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmph5 - vpxor xd4, xd4, xgft4_hi - - ; dest5 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl5, xtmpl5, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xtmpl5 ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmph5 - vpxor xd5, xd5, xgft5_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_MAD_AVX, 02, 00, 020d diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx2.asm deleted file mode 100644 index 1b236e9a7..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_avx2.asm +++ /dev/null @@ -1,393 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_MAD_AVX2 _gf_5vect_mad_avx2 -%else - %define GF_5VECT_MAD_AVX2 gf_5vect_mad_avx2 -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_5vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 -%define dest3 mul_array -%define dest4 vec -%define dest5 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 -%define xgft5_lo ymm10 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph1 ymm3 -%define xtmph1x xmm3 -%define xtmph2 ymm4 -%define xd1 ymm5 -%define xd2 ymm6 -%define xd3 ymm7 -%define xd4 ymm8 -%define xd5 ymm9 - -align 16 -global GF_5VECT_MAD_AVX2:function -func(GF_5VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft5_lo, [tmp+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, vec - vmovdqu xgft4_lo, [tmp+2*vec] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] ; reuse vec - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;Get next dest vector - XLDR xd5, [dest5+pos] ;Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vperm2i128 xtmph1, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - vperm2i128 xtmph2, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - ; dest3 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph1 ;xd3 += partial - - vperm2i128 xtmph1, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - ; dest4 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph2 ;xd4 += partial - - ; dest5 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd5, xd5, xtmph1 ;xd5 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - XSTR [dest4+pos], xd4 - XSTR [dest5+pos], xd5 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmph1x, xtmph1x, tmp.w, 0 - vpbroadcastb xtmph1, xtmph1x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - XLDR xd5, [dest5+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph2, [constip32] ;Load const of i + 32 - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph1 ;Broadcast len to all bytes. xtmph1=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, xtmph2 - - vpand xtmph1, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmph1, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph1, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft1_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vperm2i128 xtmph1, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - vperm2i128 xtmph2, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - ; dest3 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft3_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd3, xd3, xtmph1 ;xd3 += partial - - vperm2i128 xtmph1, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - ; dest4 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft4_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd4, xd4, xtmph2 ;xd4 += partial - - ; dest5 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft5_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd5, xd5, xtmph1 ;xd5 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - XSTR [dest4+tmp], xd4 - XSTR [dest5+tmp], xd5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_MAD_AVX2, 04, 00, 020e diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_sse.asm deleted file mode 100644 index 3137f9e55..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_5vect_mad_sse.asm +++ /dev/null @@ -1,409 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_5VECT_MAD_SSE _gf_5vect_mad_sse -%else - %define GF_5VECT_MAD_SSE gf_5vect_mad_sse -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_5vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 mul_array -%define dest4 tmp2 -%define dest5 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft5_hi xmm14 -%define xgft4_lo xmm13 -%define xgft4_hi xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph5 xmm8 -%define xtmpl5 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmpl1 -%define xd4 xtmph1 -%define xd5 xtmpl2 - - -align 16 -global GF_5VECT_MAD_SSE:function -func(GF_5VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - movdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - movdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - movdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqa xtmph5, xgft5_hi ;Reload const array registers - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - XLDR xd5, [dest5+pos] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - movdqa xtmph2, xgft4_hi ;Reload const array registers - movdqa xtmpl3, xgft4_lo ;Reload const array registers - - ; dest5 - pshufb xtmph5, x0 ;Lookup mul table of high nibble - pshufb xtmpl5, xtmpa ;Lookup mul table of low nibble - pxor xtmph5, xtmpl5 ;GF add high and low partials - pxor xd5, xtmph5 - - ; dest4 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl3 ;GF add high and low partials - pxor xd4, xtmph2 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - - sub len, pos - - movdqa xtmpl1, [constip16] ;Load const of i + 16 - pinsrb xtmph5, len.w, 15 - pshufb xtmph5, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmph5, xtmpl1 - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pand xtmph1, xtmph5 - pxor xd1, xtmph1 - - XLDR xd3, [dest3+tmp] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+tmp] ;Reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pand xtmph2, xtmph5 - pxor xd2, xtmph2 - - XLDR xd5, [dest5+tmp] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pand xtmph3, xtmph5 - pxor xd3, xtmph3 - - ; dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmph5 - pxor xd4, xgft4_hi - - ; dest5 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xtmpl5, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xtmpl5 ;GF add high and low partials - pand xgft5_hi, xtmph5 - pxor xd5, xgft5_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_5VECT_MAD_SSE, 00, 00, 020c diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx.asm deleted file mode 100644 index 34c0bdafb..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx.asm +++ /dev/null @@ -1,360 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_DOT_PROD_AVX _gf_6vect_dot_prod_avx -%else - %define GF_6VECT_DOT_PROD_AVX gf_6vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm2 -%define xp2 xmm3 -%define xp3 xmm4 -%define xp4 xmm5 -%define xp5 xmm6 -%define xp6 xmm7 - -align 16 -global GF_6VECT_DOT_PROD_AVX:function -func(GF_6VECT_DOT_PROD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - vpxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - - vmovdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft1_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - vmovdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft2_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - vmovdqu xgft3_hi, [tmp+ptr+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp4, xgft1_hi ;xp4 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp5, xgft2_hi ;xp5 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_DOT_PROD_AVX, 02, 03, 0195 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx2.asm deleted file mode 100644 index 9a020f70f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_avx2.asm +++ /dev/null @@ -1,373 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_DOT_PROD_AVX2 _gf_6vect_dot_prod_avx2 -%else - %define GF_6VECT_DOT_PROD_AVX2 gf_6vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - vmovdqa [rsp + 9*16], xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft2_hi ymm11 -%define xgft3_lo ymm10 -%define xgft3_hi ymm9 -%define x0 ymm0 -%define xtmpa ymm1 -%define xp1 ymm2 -%define xp2 ymm3 -%define xp3 ymm4 -%define xp4 ymm5 -%define xp5 ymm6 -%define xp6 ymm7 - -align 16 -global GF_6VECT_DOT_PROD_AVX2:function -func(GF_6VECT_DOT_PROD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop32: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - vpxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - add vec_i, PS - - vpand xgft3_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft3_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft3_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - - vmovdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - vmovdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp4, xgft1_hi ;xp4 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp5, xgft2_hi ;xp5 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_DOT_PROD_AVX2, 04, 03, 019a diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_sse.asm deleted file mode 100644 index b37480be9..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_dot_prod_sse.asm +++ /dev/null @@ -1,360 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_DOT_PROD_SSE _gf_6vect_dot_prod_sse -%else - %define GF_6VECT_DOT_PROD_SSE gf_6vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - movdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm2 -%define xgft1_hi xmm3 -%define xgft2_lo xmm4 -%define xgft2_hi xmm5 -%define xgft3_lo xmm6 -%define xgft3_hi xmm7 -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm8 -%define xp2 xmm9 -%define xp3 xmm10 -%define xp4 xmm11 -%define xp5 xmm12 -%define xp6 xmm13 - -align 16 -global GF_6VECT_DOT_PROD_SSE:function -func(GF_6VECT_DOT_PROD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - pxor xp5, xp5 - pxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - - movdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft1_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - movdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft2_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - movdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - movdqu xgft3_hi, [tmp+ptr+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp4, xgft1_hi ;xp4 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp5, xgft2_hi ;xp5 += partial - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_DOT_PROD_SSE, 00, 04, 0066 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx.asm deleted file mode 100644 index f82b96736..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx.asm +++ /dev/null @@ -1,433 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_MAD_AVX _gf_6vect_mad_avx -%else - %define GF_6VECT_MAD_AVX gf_6vect_mad_avx -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define tmp5 rdi - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 tmp2 -%define dest4 mul_array -%define dest5 tmp5 -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft4_lo xmm14 -%define xgft4_hi xmm13 -%define xgft5_lo xmm12 -%define xgft5_hi xmm11 -%define xgft6_lo xmm10 -%define xgft6_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - - -align 16 -global GF_6VECT_MAD_AVX:function -func(GF_6VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - - sal vec, 5 ;Multiply by 32 - lea vec_i, [tmp + vec] ;vec_i = vec*96 - lea mul_array, [tmp + vec_i] ;mul_array = vec*160 - - vmovdqu xgft5_lo, [tmp3+2*tmp] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft4_lo, [tmp3+vec_i] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - vmovdqu xgft4_hi, [tmp3+vec_i+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - vmovdqu xgft6_lo, [tmp3+mul_array] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - vmovdqu xgft6_hi, [tmp3+mul_array+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - - mov dest2, [dest1+PS] - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - - ;dest1 - vpshufb xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ;dest2 - vpshufb xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xtmph2 - - ;dest3 - vpshufb xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - - ;dest4 - XLDR xd1, [dest4+pos] ;Get next dest vector - vpshufb xtmph1, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd2, [dest5+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+pos] ;reuse xtmph1. Get next dest vector - - ;dest5 - vpshufb xtmph2, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - ;dest6 - vpshufb xtmph3, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - XSTR [dest4+pos], xd1 ;Store result into dest4 - XSTR [dest5+pos], xd2 ;Store result into dest5 - XSTR [dest6+pos], xd3 ;Store result into dest6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - ;; Overlapped offset length-16 - mov tmp, len ;Backup len as len=rdi - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest4+tmp] ;Get next dest vector - XLDR xd2, [dest5+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - vmovdqa xtmph3, [constip16] ;Load const of i + 16 - vpinsrb xtmpl3, len.w, 15 - vpshufb xtmpl3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ;dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmpl3 - vpxor xd1, xd1, xgft4_hi - - ;dest5 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xgft5_lo ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmpl3 - vpxor xd2, xd2, xgft5_hi - - ;dest6 - vpshufb xgft6_hi, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft6_hi, xgft6_hi, xgft6_lo ;GF add high and low partials - vpand xgft6_hi, xgft6_hi, xtmpl3 - vpxor xd3, xd3, xgft6_hi - - XSTR [dest4+tmp], xd1 ;Store result into dest4 - XSTR [dest5+tmp], xd2 ;Store result into dest5 - XSTR [dest6+tmp], xd3 ;Store result into dest6 - - vmovdqu xgft4_lo, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft4_hi, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft5_lo, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft5_hi, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft6_lo, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft6_hi, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest3 vector - - ;dest1 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmpl3 - vpxor xd1, xd1, xgft4_hi - - ;dest2 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xgft5_lo ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmpl3 - vpxor xd2, xd2, xgft5_hi - - ;dest3 - vpshufb xgft6_hi, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft6_hi, xgft6_hi, xgft6_lo ;GF add high and low partials - vpand xgft6_hi, xgft6_hi, xtmpl3 - vpxor xd3, xd3, xgft6_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_MAD_AVX, 02, 00, 0210 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx2.asm deleted file mode 100644 index 86566b2a2..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_avx2.asm +++ /dev/null @@ -1,435 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_MAD_AVX2 _gf_6vect_mad_avx2 -%else - %define GF_6VECT_MAD_AVX2 gf_6vect_mad_avx2 -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp3 -%define dest3 tmp2 -%define dest4 mul_array -%define dest5 vec -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 -%define xgft5_lo ymm10 -%define xgft6_lo ymm9 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph ymm3 -%define xtmphx xmm3 -%define xd1 ymm4 -%define xd2 ymm5 -%define xd3 ymm6 -%define xd4 ymm7 -%define xd5 ymm8 -%define xd6 xd1 - -align 16 -global GF_6VECT_MAD_AVX2:function -func(GF_6VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - mov vec_i, vec - mov mul_array, vec - sal vec_i, 1 - sal mul_array, 1 - add vec_i, vec ;vec_i=vec*96 - add mul_array, vec_i ;vec_i=vec*160 - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vec_i] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - ; " Fx{00}, Fx{10}, ..., Fx{f0} - vmovdqu xgft5_lo, [tmp+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft6_lo, [tmp+mul_array] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - mov dest2, [dest1+PS] ; reuse tmp3 - mov dest3, [dest1+2*PS] ; reuse tmp2 - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] ; reuse vec - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;Get next dest vector - XLDR xd5, [dest5+pos] ;Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - ;dest1 - vperm2i128 xtmph, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph ;xd1 += partial - - XSTR [dest1+pos], xd1 ;Store result into dest1 - - ;dest2 - vperm2i128 xtmph, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph ;xd2 += partial - - ;dest3 - vperm2i128 xtmph, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph ;xd3 += partial - - XLDR xd6, [dest6+pos] ;reuse xd1. Get next dest vector - - ;dest4 - vperm2i128 xtmph, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph ;xd4 += partial - - ;dest5 - vperm2i128 xtmph, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd5, xd5, xtmph ;xd5 += partial - - ;dest6 - vperm2i128 xtmph, xgft6_lo, xgft6_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd6, xd6, xtmph ;xd6 += partial - - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - XSTR [dest6+pos], xd6 ;Store result into dest6 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmphx, xtmphx, tmp.w, 0 - vpbroadcastb xtmph, xtmphx ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - XLDR xd5, [dest5+tmp] ;Get next dest vector - - sub len, pos - - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph ;Broadcast len to all bytes. xtmph=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, [constip32] - - vpand xtmph, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmph, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - ;dest1 - vperm2i128 xtmph, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft1_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd1, xd1, xtmph ;xd1 += partial - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - - ;dest2 - vperm2i128 xtmph, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft2_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd2, xd2, xtmph ;xd2 += partial - - ;dest3 - vperm2i128 xtmph, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft3_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd3, xd3, xtmph ;xd3 += partial - - XLDR xd6, [dest6+tmp] ;reuse xd1. Get next dest vector - - ;dest4 - vperm2i128 xtmph, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft4_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd4, xd4, xtmph ;xd4 += partial - - ;dest5 - vperm2i128 xtmph, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft5_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd5, xd5, xtmph ;xd5 += partial - - ;dest6 - vperm2i128 xtmph, xgft6_lo, xgft6_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft6_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd6, xd6, xtmph ;xd6 += partial - - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - XSTR [dest6+tmp], xd6 ;Store result into dest6 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_MAD_AVX2, 04, 00, 0211 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_sse.asm deleted file mode 100644 index 9d8374b29..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_6vect_mad_sse.asm +++ /dev/null @@ -1,446 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_6VECT_MAD_SSE _gf_6vect_mad_sse -%else - %define GF_6VECT_MAD_SSE gf_6vect_mad_sse -%endif - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define tmp5 rdi - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 tmp4 -%define dest5 tmp5 -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft4_lo xmm14 -%define xgft4_hi xmm13 -%define xgft5_lo xmm12 -%define xgft5_hi xmm11 -%define xgft6_lo xmm10 -%define xgft6_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - - -align 16 -global GF_6VECT_MAD_SSE:function -func(GF_6VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - - sal vec, 5 ;Multiply by 32 - lea vec_i, [tmp + vec] ;vec_i = 96 - lea mul_array, [tmp + vec_i] ;mul_array = 160 - - movdqu xgft5_lo, [tmp3+2*tmp] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - movdqu xgft4_lo, [tmp3+vec_i] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - movdqu xgft4_hi, [tmp3+vec_i+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - movdqu xgft6_lo, [tmp3+mul_array] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - movdqu xgft6_hi, [tmp3+mul_array+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - - mov dest2, [dest1+PS] - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ;dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest3 vector - - ;dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ;dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - - movdqa xtmph1, xgft4_hi ;Reload const array registers - movdqa xtmpl1, xgft4_lo ;Reload const array registers - movdqa xtmph2, xgft5_hi ;Reload const array registers - movdqa xtmpl2, xgft5_lo ;Reload const array registers - movdqa xtmph3, xgft6_hi ;Reload const array registers - movdqa xtmpl3, xgft6_lo ;Reload const array registers - - ;dest4 - XLDR xd1, [dest4+pos] ;Get next dest vector - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest5+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+pos] ;reuse xtmph1. Get next dest vector - - ;dest5 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ;dest6 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest4+pos], xd1 ;Store result into dest4 - XSTR [dest5+pos], xd2 ;Store result into dest5 - XSTR [dest6+pos], xd3 ;Store result into dest6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - ;; Overlapped offset length-16 - mov tmp, len ;Backup len as len=rdi - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest4+tmp] ;Get next dest vector - XLDR xd2, [dest5+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - pinsrb xtmpl3, len.w, 15 - pshufb xtmpl3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmpl3, xtmph3 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ;dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmpl3 - pxor xd1, xgft4_hi - - ;dest5 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xgft5_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xgft5_lo ;GF add high and low partials - pand xgft5_hi, xtmpl3 - pxor xd2, xgft5_hi - - ;dest6 - pshufb xgft6_hi, x0 ;Lookup mul table of high nibble - pshufb xgft6_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft6_hi, xgft6_lo ;GF add high and low partials - pand xgft6_hi, xtmpl3 - pxor xd3, xgft6_hi - - XSTR [dest4+tmp], xd1 ;Store result into dest4 - XSTR [dest5+tmp], xd2 ;Store result into dest5 - XSTR [dest6+tmp], xd3 ;Store result into dest6 - - movdqu xgft4_lo, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft4_hi, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft5_lo, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft5_hi, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xgft6_lo, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft6_hi, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest3 vector - - ;dest1 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmpl3 - pxor xd1, xgft4_hi - - ;dest2 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xgft5_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xgft5_lo ;GF add high and low partials - pand xgft5_hi, xtmpl3 - pxor xd2, xgft5_hi - - ;dest3 - pshufb xgft6_hi, x0 ;Lookup mul table of high nibble - pshufb xgft6_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft6_hi, xgft6_lo ;GF add high and low partials - pand xgft6_hi, xtmpl3 - pxor xd3, xgft6_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_6VECT_MAD_SSE, 00, 00, 020f diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx.asm deleted file mode 100644 index dfe0e1f95..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx.asm +++ /dev/null @@ -1,303 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_avx(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_DOT_PROD_AVX _gf_vect_dot_prod_avx -%else - %define GF_VECT_DOT_PROD_AVX gf_vect_dot_prod_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - - %ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f xmm5 -%define xgft_lo xmm4 -%define xgft_hi xmm3 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp xmm2 - -align 16 -global GF_VECT_DOT_PROD_AVX:function -func(GF_VECT_DOT_PROD_AVX) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - -.loop16: - vpxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - vmovdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft_hi, [tmp+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft_hi, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft_lo, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft_hi, xgft_hi, xgft_lo ;GF add high and low partials - vpxor xp, xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 16 ;Loop on 16 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_DOT_PROD_AVX, 02, 04, 0061 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx2.asm deleted file mode 100644 index 8744318f5..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_avx2.asm +++ /dev/null @@ -1,315 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_DOT_PROD_AVX2 _gf_vect_dot_prod_avx2 -%else - %define GF_VECT_DOT_PROD_AVX2 gf_vect_dot_prod_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - -%ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f ymm3 -%define xmask0fx xmm3 -%define xgft_lo ymm4 -%define xgft_hi ymm5 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xp ymm2 - -align 16 -global GF_VECT_DOT_PROD_AVX2:function -func(GF_VECT_DOT_PROD_AVX2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - -.loop32: - vpxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - - vmovdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vperm2i128 xgft_hi, xgft_lo, xgft_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft_lo, xgft_lo, xgft_lo, 0x00 ; swapped to lo | lo - - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft_hi, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft_lo, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft_hi, xgft_hi, xgft_lo ;GF add high and low partials - vpxor xp, xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 32 ;Loop on 32 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_DOT_PROD_AVX2, 04, 04, 0190 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_sse.asm deleted file mode 100644 index 9045fd826..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_dot_prod_sse.asm +++ /dev/null @@ -1,303 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_sse(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_DOT_PROD_SSE _gf_vect_dot_prod_sse -%else - %define GF_VECT_DOT_PROD_SSE gf_vect_dot_prod_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - - %ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f xmm5 -%define xgft_lo xmm4 -%define xgft_hi xmm3 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp xmm2 - -align 16 -global GF_VECT_DOT_PROD_SSE:function -func(GF_VECT_DOT_PROD_SSE) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - -.loop16: - pxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - movdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft_hi, [tmp+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft_hi, x0 ;Lookup mul table of high nibble - pshufb xgft_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft_hi, xgft_lo ;GF add high and low partials - pxor xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 16 ;Loop on 16 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_DOT_PROD_SSE, 00, 04, 0060 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx.asm deleted file mode 100644 index 531701a2a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx.asm +++ /dev/null @@ -1,223 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_MAD_AVX _gf_vect_mad_avx -%else - %define GF_VECT_MAD_AVX gf_vect_mad_avx -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm8 -%define xgft_lo xmm7 -%define xgft_hi xmm6 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph xmm2 -%define xtmpl xmm3 -%define xd xmm4 -%define xtmpd xmm5 - -align 16 -global GF_VECT_MAD_AVX:function -func(GF_VECT_MAD_AVX) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - sal vec_i, 5 ;Multiply by 32 - vmovdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft_hi, [vec_i+mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - - XLDR xtmpd, [dest+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd, [dest+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd, xd, xtmph ;xd += partial - - XSTR [dest+pos], xd - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - vmovdqa xd, xtmpd ;Restore xd - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_MAD_AVX, 02, 00, 0201 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx2.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx2.asm deleted file mode 100644 index 81b10175d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_avx2.asm +++ /dev/null @@ -1,233 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_MAD_AVX2 _gf_vect_mad_avx2 -%else - %define GF_VECT_MAD_AVX2 gf_vect_mad_avx2 -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 ; must be saved and loaded - %define arg5 r15 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size - %endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - - -;;; gf_vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm8 -%define xmask0fx xmm8 -%define xgft_lo ymm7 -%define xgft_hi ymm6 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph ymm2 -%define xtmpl ymm3 -%define xd ymm4 -%define xtmpd ymm5 - -align 16 -global GF_VECT_MAD_AVX2:function -func(GF_VECT_MAD_AVX2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - vmovdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vperm2i128 xgft_hi, xgft_lo, xgft_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft_lo, xgft_lo, xgft_lo, 0x00 ; swapped to lo | lo - - XLDR xtmpd, [dest+len] ;backup the last 32 bytes in dest - -.loop32: - XLDR xd, [dest+pos] ;Get next dest vector -.loop32_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd, xd, xtmph ;xd += partial - - XSTR [dest+pos], xd - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - vmovdqa xd, xtmpd ;Restore xd - jmp .loop32_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_MAD_AVX2, 04, 00, 0202 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_sse.asm deleted file mode 100644 index d9484d2d9..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mad_sse.asm +++ /dev/null @@ -1,224 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_MAD_SSE _gf_vect_mad_sse -%else - %define GF_VECT_MAD_SSE gf_vect_mad_sse -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm8 -%define xgft_lo xmm7 -%define xgft_hi xmm6 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph xmm2 -%define xtmpl xmm3 -%define xd xmm4 -%define xtmpd xmm5 - - -align 16 -global GF_VECT_MAD_SSE:function -func(GF_VECT_MAD_SSE) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - movdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft_hi, [vec_i+mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - - XLDR xtmpd, [dest+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd, [dest+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph, xgft_hi ;Reload const array registers - movdqa xtmpl, xgft_lo - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - pshufb xtmph, x0 ;Lookup mul table of high nibble - pshufb xtmpl, xtmpa ;Lookup mul table of low nibble - pxor xtmph, xtmpl ;GF add high and low partials - - pxor xd, xtmph - XSTR [dest+pos], xd ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - movdqa xd, xtmpd ;Restore xd - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_MAD_SSE, 00, 00, 0200 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul.h b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul.h deleted file mode 100644 index 42aa0a456..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul.h +++ /dev/null @@ -1,148 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - * Neither the name of Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************/ - - -#ifndef _GF_VECT_MUL_H -#define _GF_VECT_MUL_H - -/** - * @file gf_vect_mul.h - * @brief Interface to functions for vector (block) multiplication in GF(2^8). - * - * This file defines the interface to routines used in fast RAID rebuild and - * erasure codes. - */ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief GF(2^8) vector multiply by constant. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * @requires SSE4.1 - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul_sse(int len, unsigned char *gftbl, void *src, void *dest); - - - /** - * @brief GF(2^8) vector multiply by constant. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * @requires AVX - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul_avx(int len, unsigned char *gftbl, void *src, void *dest); - - -/** - * @brief GF(2^8) vector multiply by constant, runs appropriate version. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. - * Len and src must be aligned to 32B. - * - * This function determines what instruction sets are enabled - * and selects the appropriate version at runtime. - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul(int len, unsigned char *gftbl, void *src, void *dest); - - -/** - * @brief Initialize 32-byte constant array for GF(2^8) vector multiply - * - * Calculates array {C{00}, C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, - * C{20}, ... , C{f0} } as required by other fast vector multiply - * functions. - * @param c Constant input. - * @param gftbl Table output. - */ - -void gf_vect_mul_init(unsigned char c, unsigned char* gftbl); - - -/** - * @brief GF(2^8) vector multiply by constant, runs baseline version. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param a Pointer to 32-byte array of pre-calculated constants based on C. - * only use 2nd element is used. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - */ - -void gf_vect_mul_base(int len, unsigned char *a, unsigned char *src, - unsigned char *dest); - -#ifdef __cplusplus -} -#endif - -#endif //_GF_VECT_MUL_H diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_avx.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_avx.asm deleted file mode 100644 index 80155ba0e..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_avx.asm +++ /dev/null @@ -1,189 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mul_avx(len, mul_array, src, dest) -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_MUL_AVX _gf_vect_mul_avx -%else - %define GF_VECT_MUL_AVX gf_vect_mul_avx -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define return rax - %define stack_size 5*16 + 8 ; must be an odd multiple of 8 - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm13, 2*16 - save_xmm128 xmm14, 3*16 - save_xmm128 xmm15, 4*16 - end_prolog - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm13, [rsp + 2*16] - vmovdqa xmm14, [rsp + 3*16] - vmovdqa xmm15, [rsp + 4*16] - add rsp, stack_size - %endmacro - -%endif - - -%define len arg0 -%define mul_array arg1 -%define src arg2 -%define dest arg3 -%define pos return - - -;;; Use Non-temporal load/stor -%ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa -%else - %define XLDR vmovntdqa - %define XSTR vmovntdq -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft_lo xmm14 -%define xgft_hi xmm13 - -%define x0 xmm0 -%define xtmp1a xmm1 -%define xtmp1b xmm2 -%define xtmp1c xmm3 -%define x1 xmm4 -%define xtmp2a xmm5 -%define xtmp2b xmm6 -%define xtmp2c xmm7 - -align 16 -global GF_VECT_MUL_AVX:function -func(GF_VECT_MUL_AVX) - FUNC_SAVE - mov pos, 0 - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - vmovdqu xgft_lo, [mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft_hi, [mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - -loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR x1, [src+pos+16] ;Get next source vector + 16B ahead - add pos, 32 ;Loop on 16 bytes at a time - cmp pos, len - vpand xtmp1a, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpand xtmp2a, x1, xmask0f - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpsraw x1, x1, 4 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vpand x1, x1, xmask0f - vpshufb xtmp1b, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmp1c, xgft_lo, xtmp1a ;Lookup mul table of low nibble - vpshufb xtmp2b, xgft_hi, x1 ;Lookup mul table of high nibble - vpshufb xtmp2c, xgft_lo, xtmp2a ;Lookup mul table of low nibble - vpxor xtmp1b, xtmp1b, xtmp1c ;GF add high and low partials - vpxor xtmp2b, xtmp2b, xtmp2c - XSTR [dest+pos-32], xtmp1b ;Store result - XSTR [dest+pos-16], xtmp2b ;Store +16B result - jl loop32 - - -return_pass: - FUNC_RESTORE - sub pos, len - ret - -return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_MUL_AVX, 01, 02, 0036 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_sse.asm b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_sse.asm deleted file mode 100644 index 30d9acea7..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/gf_vect_mul_sse.asm +++ /dev/null @@ -1,195 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in -; the documentation and/or other materials provided with the -; distribution. -; * Neither the name of Intel Corporation nor the names of its -; contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mul_sse(len, mul_array, src, dest) -;;; - -%ifidn __OUTPUT_FORMAT__, macho64 - %define GF_VECT_MUL_SSE _gf_vect_mul_sse -%else - %define GF_VECT_MUL_SSE gf_vect_mul_sse -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define return rax - %define stack_size 5*16 + 8 ; must be an odd multiple of 8 - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm13, 2*16 - save_xmm128 xmm14, 3*16 - save_xmm128 xmm15, 4*16 - end_prolog - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm13, [rsp + 2*16] - movdqa xmm14, [rsp + 3*16] - movdqa xmm15, [rsp + 4*16] - add rsp, stack_size - %endmacro - -%endif - - -%define len arg0 -%define mul_array arg1 -%define src arg2 -%define dest arg3 -%define pos return - - -;;; Use Non-temporal load/stor -%ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa -%else - %define XLDR movntdqa - %define XSTR movntdq -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft_lo xmm14 -%define xgft_hi xmm13 - -%define x0 xmm0 -%define xtmp1a xmm1 -%define xtmp1b xmm2 -%define xtmp1c xmm3 -%define x1 xmm4 -%define xtmp2a xmm5 -%define xtmp2b xmm6 -%define xtmp2c xmm7 - - -align 16 -global GF_VECT_MUL_SSE:function -func(GF_VECT_MUL_SSE) - FUNC_SAVE - mov pos, 0 - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - movdqu xgft_lo, [mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft_hi, [mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - -loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR x1, [src+pos+16] ;Get next source vector + 16B ahead - movdqa xtmp1b, xgft_hi ;Reload const array registers - movdqa xtmp1c, xgft_lo - movdqa xtmp2b, xgft_hi - movdqa xtmp2c, xgft_lo - movdqa xtmp1a, x0 ;Keep unshifted copy of src - movdqa xtmp2a, x1 - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - psraw x1, 4 - pand xtmp1a, xmask0f ;Mask low src nibble in bits 4-0 - pand xtmp2a, xmask0f - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand x1, xmask0f - pshufb xtmp1b, x0 ;Lookup mul table of high nibble - pshufb xtmp1c, xtmp1a ;Lookup mul table of low nibble - pshufb xtmp2b, x1 - pshufb xtmp2c, xtmp2a - pxor xtmp1b, xtmp1c ;GF add high and low partials - pxor xtmp2b, xtmp2c - XSTR [dest+pos], xtmp1b ;Store result - XSTR [dest+pos+16], xtmp2b ;Store +16B result - add pos, 32 ;Loop on 32 bytes at at time - cmp pos, len - jl loop32 - - -return_pass: - sub pos, len - FUNC_RESTORE - ret - -return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion GF_VECT_MUL_SSE, 00, 02, 0034 diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/stdint.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/stdint.go deleted file mode 100644 index 72f6e86ae..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/stdint.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -// -// int sizeInt() -// { -// return sizeof(int); -// } -import "C" -import "unsafe" - -var ( - // See http://golang.org/ref/spec#Numeric_types - sizeInt = int(C.sizeInt()) - // SizeInt8 is the byte size of a int8. - sizeInt8 = int(unsafe.Sizeof(int8(0))) - // SizeInt16 is the byte size of a int16. - sizeInt16 = int(unsafe.Sizeof(int16(0))) - // SizeInt32 is the byte size of a int32. - sizeInt32 = int(unsafe.Sizeof(int32(0))) - // SizeInt64 is the byte size of a int64. - sizeInt64 = int(unsafe.Sizeof(int64(0))) -) diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/vandermonde_test.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/vandermonde_test.go deleted file mode 100644 index 490830557..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/erasure/vandermonde_test.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package erasure - -import ( - "bytes" - - . "gopkg.in/check.v1" -) - -func corruptChunks(chunks [][]byte, errorIndex []int) [][]byte { - for _, err := range errorIndex { - chunks[err] = nil - } - return chunks -} - -func (s *MySuite) TestVanderMondeEncodeDecodeFailure(c *C) { - ep, _ := ValidateParams(k, m, Vandermonde) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 11, 13} - chunks = corruptChunks(chunks, errorIndex) - - _, err = e.Decode(chunks, len(data)) - c.Assert(err, Not(IsNil)) -} - -func (s *MySuite) TestVanderMondeEncodeDecodeSuccess(c *C) { - ep, _ := ValidateParams(k, m, Vandermonde) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 13} - chunks = corruptChunks(chunks, errorIndex) - - recoveredData, err := e.Decode(chunks, len(data)) - c.Assert(err, IsNil) - - if !bytes.Equal(recoveredData, data) { - c.Fatalf("Recovered data mismatches with original data") - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/.gitignore b/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/.gitignore deleted file mode 100644 index daf913b1b..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/LICENSE b/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/LICENSE deleted file mode 100644 index e06d20818..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/README.md b/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/README.md deleted file mode 100644 index d7391ea49..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# iodine -Iodine is an error logging framework for tracing errors. diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine.go deleted file mode 100644 index f1eead9f6..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine.go +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Iodine, (C) 2015 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package iodine - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "path" - "reflect" - "runtime" - "strconv" - "strings" - "sync" -) - -// WrappedError is the iodine error which contains a pointer to the original error -// and stack traces. -type Error struct { - EmbeddedError error `json:"-"` - ErrorMessage string - ErrorType string - - Stack []StackEntry -} - -// StackEntry contains the entry in the stack trace -type StackEntry struct { - Host string - File string - Line int - Data map[string]string -} - -var gopath string - -var globalState = struct { - sync.RWMutex - m map[string]string -}{m: make(map[string]string)} - -// SetGlobalState - set global state -func SetGlobalState(key, value string) { - globalState.Lock() - globalState.m[key] = value - globalState.Unlock() -} - -// ClearGlobalState - clear info in globalState struct -func ClearGlobalState() { - globalState.Lock() - for k := range globalState.m { - delete(globalState.m, k) - } - globalState.Unlock() -} - -// GetGlobalState - get map from globalState struct -func GetGlobalState() map[string]string { - result := make(map[string]string) - globalState.RLock() - for k, v := range globalState.m { - result[k] = v - } - globalState.RUnlock() - return result -} - -// GetGlobalStateKey - get value for key from globalState struct -func GetGlobalStateKey(k string) string { - result, ok := globalState.m[k] - if !ok { - return "" - } - return result -} - -// Error - instantiate an error, turning it into an iodine error. -// Adds an initial stack trace. -func New(err error, data map[string]string) error { - if err != nil { - entry := createStackEntry() - var newErr Error - - // check if error is wrapped - switch typedError := err.(type) { - case Error: - { - newErr = typedError - } - default: - { - newErr = Error{ - EmbeddedError: err, - ErrorMessage: err.Error(), - ErrorType: reflect.TypeOf(err).String(), - Stack: []StackEntry{}, - } - } - } - for k, v := range data { - entry.Data[k] = v - } - newErr.Stack = append(newErr.Stack, entry) - return newErr - } - return nil -} - -// createStackEntry - create stack entries -func createStackEntry() StackEntry { - host, _ := os.Hostname() - _, file, line, _ := runtime.Caller(2) - file = strings.TrimPrefix(file, gopath) // trim gopath from file - - data := GetGlobalState() - for k, v := range getSystemData() { - data[k] = v - } - - entry := StackEntry{ - Host: host, - File: file, - Line: line, - Data: data, - } - return entry -} - -func getSystemData() map[string]string { - host, err := os.Hostname() - if err != nil { - host = "" - } - memstats := &runtime.MemStats{} - runtime.ReadMemStats(memstats) - return map[string]string{ - "sys.host": host, - "sys.os": runtime.GOOS, - "sys.arch": runtime.GOARCH, - "sys.go": runtime.Version(), - "sys.cpus": strconv.Itoa(runtime.NumCPU()), - "sys.mem.used": strconv.FormatUint(memstats.Alloc, 10), - "sys.mem.allocated": strconv.FormatUint(memstats.TotalAlloc, 10), - "sys.mem.heap.used": strconv.FormatUint(memstats.HeapAlloc, 10), - "sys.mem.heap.allocated": strconv.FormatUint(memstats.HeapSys, 10), - } -} - -// Annotate an error with a stack entry and returns itself -//func (err *WrappedError) Annotate(info map[string]string) *WrappedError { -// entry := createStackEntry() -// for k, v := range info { -// entry.Data[k] = v -// } -// err.Stack = append(err.Stack, entry) -// return err -//} - -// EmitJSON writes JSON output for the error -func (err Error) EmitJSON() ([]byte, error) { - return json.Marshal(err) -} - -// EmitHumanReadable returns a human readable error message -func (err Error) EmitHumanReadable() string { - var errorBuffer bytes.Buffer - fmt.Fprintln(&errorBuffer, err.ErrorMessage) - for i, entry := range err.Stack { - fmt.Fprintln(&errorBuffer, "-", i, entry.Host+":"+entry.File+":"+strconv.Itoa(entry.Line), entry.Data) - } - return string(errorBuffer.Bytes()) -} - -// Emits the original error message -func (err Error) Error() string { - return err.EmitHumanReadable() -} - -func init() { - _, iodineFile, _, _ := runtime.Caller(0) - iodineFile = path.Dir(iodineFile) // trim iodine.go - iodineFile = path.Dir(iodineFile) // trim iodine - iodineFile = path.Dir(iodineFile) // trim minio-io - gopath = path.Dir(iodineFile) + "/" // trim github.com -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine_test.go b/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine_test.go deleted file mode 100644 index 9b8ddc0c5..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/minio-io/iodine/iodine_test.go +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Iodine, (C) 2015 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package iodine - -import ( - "encoding/json" - "errors" - "testing" -) - -func TestIodine(t *testing.T) { - iodineError := New(errors.New("Hello"), nil) - iodineError = New(iodineError, nil) - iodineError = New(iodineError, nil) - iodineError = New(iodineError, nil) - switch typedError := iodineError.(type) { - case Error: - { - if len(typedError.Stack) != 4 { - t.Fail() - } - _, err := json.MarshalIndent(typedError, "", " ") - if err != nil { - t.Fail() - } - } - default: - { - t.Fail() - } - } -} - -func TestState(t *testing.T) { - SetGlobalState("hello", "world") - result := GetGlobalStateKey("hello") - if result != "world" { - t.Error("global state not set: hello->world") - t.Fail() - } - ClearGlobalState() - if len(GetGlobalState()) != 0 { - t.Fail() - } - SetGlobalState("foo", "bar") - err := New(errors.New("a simple error"), nil) - switch typedError := err.(type) { - case Error: - { - if res, ok := typedError.Stack[0].Data["foo"]; ok { - if res != "bar" { - t.Error("global state not set: foo->bar") - } - } else { - t.Fail() - } - typedError = New(typedError, map[string]string{"foo2": "bar2"}).(Error) - if res, ok := typedError.Stack[0].Data["foo"]; ok { - if res != "bar" { - t.Error("annotate should not modify previous data entries") - } - } else { - t.Error("annotate should not remove previous data entries") - } - if res, ok := typedError.Stack[1].Data["foo"]; ok { - if res != "bar" { - t.Error("global state should set value properly in annotate") - } - } else { - t.Error("global state should set key properly in annotate") - } - if res, ok := typedError.Stack[1].Data["foo2"]; ok { - if res != "bar2" { - // typedError = Error(typedError, nil).(WrappedError) - t.Error("foo2 -> bar should be set") - } - } else { - // typedError = Error(typedError, nil).(WrappedError) - t.Error("foo2 should be set") - } - } - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/.gitignore b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/.gitignore deleted file mode 100644 index 00268614f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/LICENSE.md b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/LICENSE.md deleted file mode 100644 index 219994581..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/LICENSE.md +++ /dev/null @@ -1,23 +0,0 @@ -objx - by Mat Ryer and Tyler Bunnell - -The MIT License (MIT) - -Copyright (c) 2014 Stretchr, Inc. - -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/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/README.md b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/README.md deleted file mode 100644 index 4aa180687..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# objx - - * Jump into the [API Documentation](http://godoc.org/github.com/stretchr/objx) diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors.go deleted file mode 100644 index 721bcac79..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors.go +++ /dev/null @@ -1,179 +0,0 @@ -package objx - -import ( - "fmt" - "regexp" - "strconv" - "strings" -) - -// arrayAccesRegexString is the regex used to extract the array number -// from the access path -const arrayAccesRegexString = `^(.+)\[([0-9]+)\]$` - -// arrayAccesRegex is the compiled arrayAccesRegexString -var arrayAccesRegex = regexp.MustCompile(arrayAccesRegexString) - -// Get gets the value using the specified selector and -// returns it inside a new Obj object. -// -// If it cannot find the value, Get will return a nil -// value inside an instance of Obj. -// -// Get can only operate directly on map[string]interface{} and []interface. -// -// Example -// -// To access the title of the third chapter of the second book, do: -// -// o.Get("books[1].chapters[2].title") -func (m Map) Get(selector string) *Value { - rawObj := access(m, selector, nil, false, false) - return &Value{data: rawObj} -} - -// Set sets the value using the specified selector and -// returns the object on which Set was called. -// -// Set can only operate directly on map[string]interface{} and []interface -// -// Example -// -// To set the title of the third chapter of the second book, do: -// -// o.Set("books[1].chapters[2].title","Time to Go") -func (m Map) Set(selector string, value interface{}) Map { - access(m, selector, value, true, false) - return m -} - -// access accesses the object using the selector and performs the -// appropriate action. -func access(current, selector, value interface{}, isSet, panics bool) interface{} { - - switch selector.(type) { - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - - if array, ok := current.([]interface{}); ok { - index := intFromInterface(selector) - - if index >= len(array) { - if panics { - panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) - } - return nil - } - - return array[index] - } - - return nil - - case string: - - selStr := selector.(string) - selSegs := strings.SplitN(selStr, PathSeparator, 2) - thisSel := selSegs[0] - index := -1 - var err error - - // https://github.com/stretchr/objx/issues/12 - if strings.Contains(thisSel, "[") { - - arrayMatches := arrayAccesRegex.FindStringSubmatch(thisSel) - - if len(arrayMatches) > 0 { - - // Get the key into the map - thisSel = arrayMatches[1] - - // Get the index into the array at the key - index, err = strconv.Atoi(arrayMatches[2]) - - if err != nil { - // This should never happen. If it does, something has gone - // seriously wrong. Panic. - panic("objx: Array index is not an integer. Must use array[int].") - } - - } - } - - if curMap, ok := current.(Map); ok { - current = map[string]interface{}(curMap) - } - - // get the object in question - switch current.(type) { - case map[string]interface{}: - curMSI := current.(map[string]interface{}) - if len(selSegs) <= 1 && isSet { - curMSI[thisSel] = value - return nil - } else { - current = curMSI[thisSel] - } - default: - current = nil - } - - if current == nil && panics { - panic(fmt.Sprintf("objx: '%v' invalid on object.", selector)) - } - - // do we need to access the item of an array? - if index > -1 { - if array, ok := current.([]interface{}); ok { - if index < len(array) { - current = array[index] - } else { - if panics { - panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) - } - current = nil - } - } - } - - if len(selSegs) > 1 { - current = access(current, selSegs[1], value, isSet, panics) - } - - } - - return current - -} - -// intFromInterface converts an interface object to the largest -// representation of an unsigned integer using a type switch and -// assertions -func intFromInterface(selector interface{}) int { - var value int - switch selector.(type) { - case int: - value = selector.(int) - case int8: - value = int(selector.(int8)) - case int16: - value = int(selector.(int16)) - case int32: - value = int(selector.(int32)) - case int64: - value = int(selector.(int64)) - case uint: - value = int(selector.(uint)) - case uint8: - value = int(selector.(uint8)) - case uint16: - value = int(selector.(uint16)) - case uint32: - value = int(selector.(uint32)) - case uint64: - value = int(selector.(uint64)) - default: - panic("objx: array access argument is not an integer type (this should never happen)") - } - - return value -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors_test.go deleted file mode 100644 index ce5d8e4aa..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/accessors_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestAccessorsAccessGetSingleField(t *testing.T) { - - current := map[string]interface{}{"name": "Tyler"} - assert.Equal(t, "Tyler", access(current, "name", nil, false, true)) - -} -func TestAccessorsAccessGetDeep(t *testing.T) { - - current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}} - assert.Equal(t, "Tyler", access(current, "name.first", nil, false, true)) - assert.Equal(t, "Bunnell", access(current, "name.last", nil, false, true)) - -} -func TestAccessorsAccessGetDeepDeep(t *testing.T) { - - current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}} - assert.Equal(t, 4, access(current, "one.two.three.four", nil, false, true)) - -} -func TestAccessorsAccessGetInsideArray(t *testing.T) { - - current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}} - assert.Equal(t, "Tyler", access(current, "names[0].first", nil, false, true)) - assert.Equal(t, "Bunnell", access(current, "names[0].last", nil, false, true)) - assert.Equal(t, "Capitol", access(current, "names[1].first", nil, false, true)) - assert.Equal(t, "Bollocks", access(current, "names[1].last", nil, false, true)) - - assert.Panics(t, func() { - access(current, "names[2]", nil, false, true) - }) - assert.Nil(t, access(current, "names[2]", nil, false, false)) - -} - -func TestAccessorsAccessGetFromArrayWithInt(t *testing.T) { - - current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}} - one := access(current, 0, nil, false, false) - two := access(current, 1, nil, false, false) - three := access(current, 2, nil, false, false) - - assert.Equal(t, "Tyler", one.(map[string]interface{})["first"]) - assert.Equal(t, "Capitol", two.(map[string]interface{})["first"]) - assert.Nil(t, three) - -} - -func TestAccessorsGet(t *testing.T) { - - current := New(map[string]interface{}{"name": "Tyler"}) - assert.Equal(t, "Tyler", current.Get("name").data) - -} - -func TestAccessorsAccessSetSingleField(t *testing.T) { - - current := map[string]interface{}{"name": "Tyler"} - access(current, "name", "Mat", true, false) - assert.Equal(t, current["name"], "Mat") - - access(current, "age", 29, true, true) - assert.Equal(t, current["age"], 29) - -} - -func TestAccessorsAccessSetSingleFieldNotExisting(t *testing.T) { - - current := map[string]interface{}{} - access(current, "name", "Mat", true, false) - assert.Equal(t, current["name"], "Mat") - -} - -func TestAccessorsAccessSetDeep(t *testing.T) { - - current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}} - - access(current, "name.first", "Mat", true, true) - access(current, "name.last", "Ryer", true, true) - - assert.Equal(t, "Mat", access(current, "name.first", nil, false, true)) - assert.Equal(t, "Ryer", access(current, "name.last", nil, false, true)) - -} -func TestAccessorsAccessSetDeepDeep(t *testing.T) { - - current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}} - - access(current, "one.two.three.four", 5, true, true) - - assert.Equal(t, 5, access(current, "one.two.three.four", nil, false, true)) - -} -func TestAccessorsAccessSetArray(t *testing.T) { - - current := map[string]interface{}{"names": []interface{}{"Tyler"}} - - access(current, "names[0]", "Mat", true, true) - - assert.Equal(t, "Mat", access(current, "names[0]", nil, false, true)) - -} -func TestAccessorsAccessSetInsideArray(t *testing.T) { - - current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}} - - access(current, "names[0].first", "Mat", true, true) - access(current, "names[0].last", "Ryer", true, true) - access(current, "names[1].first", "Captain", true, true) - access(current, "names[1].last", "Underpants", true, true) - - assert.Equal(t, "Mat", access(current, "names[0].first", nil, false, true)) - assert.Equal(t, "Ryer", access(current, "names[0].last", nil, false, true)) - assert.Equal(t, "Captain", access(current, "names[1].first", nil, false, true)) - assert.Equal(t, "Underpants", access(current, "names[1].last", nil, false, true)) - -} - -func TestAccessorsAccessSetFromArrayWithInt(t *testing.T) { - - current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}} - one := access(current, 0, nil, false, false) - two := access(current, 1, nil, false, false) - three := access(current, 2, nil, false, false) - - assert.Equal(t, "Tyler", one.(map[string]interface{})["first"]) - assert.Equal(t, "Capitol", two.(map[string]interface{})["first"]) - assert.Nil(t, three) - -} - -func TestAccessorsSet(t *testing.T) { - - current := New(map[string]interface{}{"name": "Tyler"}) - current.Set("name", "Mat") - assert.Equal(t, "Mat", current.Get("name").data) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/array-access.txt b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/array-access.txt deleted file mode 100644 index 306023475..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/array-access.txt +++ /dev/null @@ -1,14 +0,0 @@ - case []{1}: - a := object.([]{1}) - if isSet { - a[index] = value.({1}) - } else { - if index >= len(a) { - if panics { - panic(fmt.Sprintf("objx: Index %d is out of range because the []{1} only contains %d items.", index, len(a))) - } - return nil - } else { - return a[index] - } - } diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/index.html b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/index.html deleted file mode 100644 index 379ffc3c0..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Codegen - - - - - -

- Template -

-

- Use {x} as a placeholder for each argument. -

- - -

- Arguments (comma separated) -

-

- One block per line -

- - -

- Output -

- - - - - - - - diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/template.txt b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/template.txt deleted file mode 100644 index b396900b8..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/template.txt +++ /dev/null @@ -1,286 +0,0 @@ -/* - {4} ({1} and []{1}) - -------------------------------------------------- -*/ - -// {4} gets the value as a {1}, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) {4}(optionalDefault ...{1}) {1} { - if s, ok := v.data.({1}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return {3} -} - -// Must{4} gets the value as a {1}. -// -// Panics if the object is not a {1}. -func (v *Value) Must{4}() {1} { - return v.data.({1}) -} - -// {4}Slice gets the value as a []{1}, returns the optionalDefault -// value or nil if the value is not a []{1}. -func (v *Value) {4}Slice(optionalDefault ...[]{1}) []{1} { - if s, ok := v.data.([]{1}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// Must{4}Slice gets the value as a []{1}. -// -// Panics if the object is not a []{1}. -func (v *Value) Must{4}Slice() []{1} { - return v.data.([]{1}) -} - -// Is{4} gets whether the object contained is a {1} or not. -func (v *Value) Is{4}() bool { - _, ok := v.data.({1}) - return ok -} - -// Is{4}Slice gets whether the object contained is a []{1} or not. -func (v *Value) Is{4}Slice() bool { - _, ok := v.data.([]{1}) - return ok -} - -// Each{4} calls the specified callback for each object -// in the []{1}. -// -// Panics if the object is the wrong type. -func (v *Value) Each{4}(callback func(int, {1}) bool) *Value { - - for index, val := range v.Must{4}Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// Where{4} uses the specified decider function to select items -// from the []{1}. The object contained in the result will contain -// only the selected items. -func (v *Value) Where{4}(decider func(int, {1}) bool) *Value { - - var selected []{1} - - v.Each{4}(func(index int, val {1}) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data:selected} - -} - -// Group{4} uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]{1}. -func (v *Value) Group{4}(grouper func(int, {1}) string) *Value { - - groups := make(map[string][]{1}) - - v.Each{4}(func(index int, val {1}) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]{1}, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data:groups} - -} - -// Replace{4} uses the specified function to replace each {1}s -// by iterating each item. The data in the returned result will be a -// []{1} containing the replaced items. -func (v *Value) Replace{4}(replacer func(int, {1}) {1}) *Value { - - arr := v.Must{4}Slice() - replaced := make([]{1}, len(arr)) - - v.Each{4}(func(index int, val {1}) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data:replaced} - -} - -// Collect{4} uses the specified collector function to collect a value -// for each of the {1}s in the slice. The data returned will be a -// []interface{}. -func (v *Value) Collect{4}(collector func(int, {1}) interface{}) *Value { - - arr := v.Must{4}Slice() - collected := make([]interface{}, len(arr)) - - v.Each{4}(func(index int, val {1}) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data:collected} -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func Test{4}(t *testing.T) { - - val := {1}( {2} ) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").{4}()) - assert.Equal(t, val, New(m).Get("value").Must{4}()) - assert.Equal(t, {1}({3}), New(m).Get("nothing").{4}()) - assert.Equal(t, val, New(m).Get("nothing").{4}({2})) - - assert.Panics(t, func() { - New(m).Get("age").Must{4}() - }) - -} - -func Test{4}Slice(t *testing.T) { - - val := {1}( {2} ) - m := map[string]interface{}{"value": []{1}{ val }, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").{4}Slice()[0]) - assert.Equal(t, val, New(m).Get("value").Must{4}Slice()[0]) - assert.Equal(t, []{1}(nil), New(m).Get("nothing").{4}Slice()) - assert.Equal(t, val, New(m).Get("nothing").{4}Slice( []{1}{ {1}({2}) } )[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").Must{4}Slice() - }) - -} - -func TestIs{4}(t *testing.T) { - - var v *Value - - v = &Value{data: {1}({2})} - assert.True(t, v.Is{4}()) - - v = &Value{data: []{1}{ {1}({2}) }} - assert.True(t, v.Is{4}Slice()) - -} - -func TestEach{4}(t *testing.T) { - - v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} - count := 0 - replacedVals := make([]{1}, 0) - assert.Equal(t, v, v.Each{4}(func(i int, val {1}) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.Must{4}Slice()[0]) - assert.Equal(t, replacedVals[1], v.Must{4}Slice()[1]) - assert.Equal(t, replacedVals[2], v.Must{4}Slice()[2]) - -} - -func TestWhere{4}(t *testing.T) { - - v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} - - selected := v.Where{4}(func(i int, val {1}) bool { - return i%2==0 - }).Must{4}Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroup{4}(t *testing.T) { - - v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} - - grouped := v.Group{4}(func(i int, val {1}) string { - return fmt.Sprintf("%v", i%2==0) - }).data.(map[string][]{1}) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplace{4}(t *testing.T) { - - v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} - - rawArr := v.Must{4}Slice() - - replaced := v.Replace{4}(func(index int, val {1}) {1} { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.Must{4}Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollect{4}(t *testing.T) { - - v := &Value{data: []{1}{ {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}), {1}({2}) }} - - collected := v.Collect{4}(func(index int, val {1}) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/types_list.txt b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/types_list.txt deleted file mode 100644 index 069d43d8e..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/codegen/types_list.txt +++ /dev/null @@ -1,20 +0,0 @@ -Interface,interface{},"something",nil,Inter -Map,map[string]interface{},map[string]interface{}{"name":"Tyler"},nil,MSI -ObjxMap,(Map),New(1),New(nil),ObjxMap -Bool,bool,true,false,Bool -String,string,"hello","",Str -Int,int,1,0,Int -Int8,int8,1,0,Int8 -Int16,int16,1,0,Int16 -Int32,int32,1,0,Int32 -Int64,int64,1,0,Int64 -Uint,uint,1,0,Uint -Uint8,uint8,1,0,Uint8 -Uint16,uint16,1,0,Uint16 -Uint32,uint32,1,0,Uint32 -Uint64,uint64,1,0,Uint64 -Uintptr,uintptr,1,0,Uintptr -Float32,float32,1,0,Float32 -Float64,float64,1,0,Float64 -Complex64,complex64,1,0,Complex64 -Complex128,complex128,1,0,Complex128 diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/constants.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/constants.go deleted file mode 100644 index f9eb42a25..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -package objx - -const ( - // PathSeparator is the character used to separate the elements - // of the keypath. - // - // For example, `location.address.city` - PathSeparator string = "." - - // SignatureSeparator is the character that is used to - // separate the Base64 string from the security signature. - SignatureSeparator = "_" -) diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions.go deleted file mode 100644 index 9cdfa9f9f..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions.go +++ /dev/null @@ -1,117 +0,0 @@ -package objx - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "net/url" -) - -// JSON converts the contained object to a JSON string -// representation -func (m Map) JSON() (string, error) { - - result, err := json.Marshal(m) - - if err != nil { - err = errors.New("objx: JSON encode failed with: " + err.Error()) - } - - return string(result), err - -} - -// MustJSON converts the contained object to a JSON string -// representation and panics if there is an error -func (m Map) MustJSON() string { - result, err := m.JSON() - if err != nil { - panic(err.Error()) - } - return result -} - -// Base64 converts the contained object to a Base64 string -// representation of the JSON string representation -func (m Map) Base64() (string, error) { - - var buf bytes.Buffer - - jsonData, err := m.JSON() - if err != nil { - return "", err - } - - encoder := base64.NewEncoder(base64.StdEncoding, &buf) - encoder.Write([]byte(jsonData)) - encoder.Close() - - return buf.String(), nil - -} - -// MustBase64 converts the contained object to a Base64 string -// representation of the JSON string representation and panics -// if there is an error -func (m Map) MustBase64() string { - result, err := m.Base64() - if err != nil { - panic(err.Error()) - } - return result -} - -// SignedBase64 converts the contained object to a Base64 string -// representation of the JSON string representation and signs it -// using the provided key. -func (m Map) SignedBase64(key string) (string, error) { - - base64, err := m.Base64() - if err != nil { - return "", err - } - - sig := HashWithKey(base64, key) - - return base64 + SignatureSeparator + sig, nil - -} - -// MustSignedBase64 converts the contained object to a Base64 string -// representation of the JSON string representation and signs it -// using the provided key and panics if there is an error -func (m Map) MustSignedBase64(key string) string { - result, err := m.SignedBase64(key) - if err != nil { - panic(err.Error()) - } - return result -} - -/* - URL Query - ------------------------------------------------ -*/ - -// URLValues creates a url.Values object from an Obj. This -// function requires that the wrapped object be a map[string]interface{} -func (m Map) URLValues() url.Values { - - vals := make(url.Values) - - for k, v := range m { - //TODO: can this be done without sprintf? - vals.Set(k, fmt.Sprintf("%v", v)) - } - - return vals -} - -// URLQuery gets an encoded URL query representing the given -// Obj. This function requires that the wrapped object be a -// map[string]interface{} -func (m Map) URLQuery() (string, error) { - return m.URLValues().Encode(), nil -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions_test.go deleted file mode 100644 index e9ccd2987..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/conversions_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestConversionJSON(t *testing.T) { - - jsonString := `{"name":"Mat"}` - o := MustFromJSON(jsonString) - - result, err := o.JSON() - - if assert.NoError(t, err) { - assert.Equal(t, jsonString, result) - } - - assert.Equal(t, jsonString, o.MustJSON()) - -} - -func TestConversionJSONWithError(t *testing.T) { - - o := MSI() - o["test"] = func() {} - - assert.Panics(t, func() { - o.MustJSON() - }) - - _, err := o.JSON() - - assert.Error(t, err) - -} - -func TestConversionBase64(t *testing.T) { - - o := New(map[string]interface{}{"name": "Mat"}) - - result, err := o.Base64() - - if assert.NoError(t, err) { - assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", result) - } - - assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", o.MustBase64()) - -} - -func TestConversionBase64WithError(t *testing.T) { - - o := MSI() - o["test"] = func() {} - - assert.Panics(t, func() { - o.MustBase64() - }) - - _, err := o.Base64() - - assert.Error(t, err) - -} - -func TestConversionSignedBase64(t *testing.T) { - - o := New(map[string]interface{}{"name": "Mat"}) - - result, err := o.SignedBase64("key") - - if assert.NoError(t, err) { - assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", result) - } - - assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", o.MustSignedBase64("key")) - -} - -func TestConversionSignedBase64WithError(t *testing.T) { - - o := MSI() - o["test"] = func() {} - - assert.Panics(t, func() { - o.MustSignedBase64("key") - }) - - _, err := o.SignedBase64("key") - - assert.Error(t, err) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/doc.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/doc.go deleted file mode 100644 index 47bf85e46..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/doc.go +++ /dev/null @@ -1,72 +0,0 @@ -// objx - Go package for dealing with maps, slices, JSON and other data. -// -// Overview -// -// Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes -// a powerful `Get` method (among others) that allows you to easily and quickly get -// access to data within the map, without having to worry too much about type assertions, -// missing data, default values etc. -// -// Pattern -// -// Objx uses a preditable pattern to make access data from within `map[string]interface{}'s -// easy. -// -// Call one of the `objx.` functions to create your `objx.Map` to get going: -// -// m, err := objx.FromJSON(json) -// -// NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, -// the rest will be optimistic and try to figure things out without panicking. -// -// Use `Get` to access the value you're interested in. You can use dot and array -// notation too: -// -// m.Get("places[0].latlng") -// -// Once you have saught the `Value` you're interested in, you can use the `Is*` methods -// to determine its type. -// -// if m.Get("code").IsStr() { /* ... */ } -// -// Or you can just assume the type, and use one of the strong type methods to -// extract the real value: -// -// m.Get("code").Int() -// -// If there's no value there (or if it's the wrong type) then a default value -// will be returned, or you can be explicit about the default value. -// -// Get("code").Int(-1) -// -// If you're dealing with a slice of data as a value, Objx provides many useful -// methods for iterating, manipulating and selecting that data. You can find out more -// by exploring the index below. -// -// Reading data -// -// A simple example of how to use Objx: -// -// // use MustFromJSON to make an objx.Map from some JSON -// m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) -// -// // get the details -// name := m.Get("name").Str() -// age := m.Get("age").Int() -// -// // get their nickname (or use their name if they -// // don't have one) -// nickname := m.Get("nickname").Str(name) -// -// Ranging -// -// Since `objx.Map` is a `map[string]interface{}` you can treat it as such. For -// example, to `range` the data, do what you would expect: -// -// m := objx.MustFromJSON(json) -// for key, value := range m { -// -// /* ... do your magic ... */ -// -// } -package objx diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/fixture_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/fixture_test.go deleted file mode 100644 index 27f7d9049..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/fixture_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -var fixtures = []struct { - // name is the name of the fixture (used for reporting - // failures) - name string - // data is the JSON data to be worked on - data string - // get is the argument(s) to pass to Get - get interface{} - // output is the expected output - output interface{} -}{ - { - name: "Simple get", - data: `{"name": "Mat"}`, - get: "name", - output: "Mat", - }, - { - name: "Get with dot notation", - data: `{"address": {"city": "Boulder"}}`, - get: "address.city", - output: "Boulder", - }, - { - name: "Deep get with dot notation", - data: `{"one": {"two": {"three": {"four": "hello"}}}}`, - get: "one.two.three.four", - output: "hello", - }, - { - name: "Get missing with dot notation", - data: `{"one": {"two": {"three": {"four": "hello"}}}}`, - get: "one.ten", - output: nil, - }, - { - name: "Get with array notation", - data: `{"tags": ["one", "two", "three"]}`, - get: "tags[1]", - output: "two", - }, - { - name: "Get with array and dot notation", - data: `{"types": { "tags": ["one", "two", "three"]}}`, - get: "types.tags[1]", - output: "two", - }, - { - name: "Get with array and dot notation - field after array", - data: `{"tags": [{"name":"one"}, {"name":"two"}, {"name":"three"}]}`, - get: "tags[1].name", - output: "two", - }, - { - name: "Complex get with array and dot notation", - data: `{"tags": [{"list": [{"one":"pizza"}]}]}`, - get: "tags[0].list[0].one", - output: "pizza", - }, - { - name: "Get field from within string should be nil", - data: `{"name":"Tyler"}`, - get: "name.something", - output: nil, - }, - { - name: "Get field from within string (using array accessor) should be nil", - data: `{"numbers":["one", "two", "three"]}`, - get: "numbers[0].nope", - output: nil, - }, -} - -func TestFixtures(t *testing.T) { - - for _, fixture := range fixtures { - - m := MustFromJSON(fixture.data) - - // get the value - t.Logf("Running get fixture: \"%s\" (%v)", fixture.name, fixture) - value := m.Get(fixture.get.(string)) - - // make sure it matches - assert.Equal(t, fixture.output, value.data, - "Get fixture \"%s\" failed: %v", fixture.name, fixture, - ) - - } - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map.go deleted file mode 100644 index eb6ed8e28..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map.go +++ /dev/null @@ -1,222 +0,0 @@ -package objx - -import ( - "encoding/base64" - "encoding/json" - "errors" - "io/ioutil" - "net/url" - "strings" -) - -// MSIConvertable is an interface that defines methods for converting your -// custom types to a map[string]interface{} representation. -type MSIConvertable interface { - // MSI gets a map[string]interface{} (msi) representing the - // object. - MSI() map[string]interface{} -} - -// Map provides extended functionality for working with -// untyped data, in particular map[string]interface (msi). -type Map map[string]interface{} - -// Value returns the internal value instance -func (m Map) Value() *Value { - return &Value{data: m} -} - -// Nil represents a nil Map. -var Nil Map = New(nil) - -// New creates a new Map containing the map[string]interface{} in the data argument. -// If the data argument is not a map[string]interface, New attempts to call the -// MSI() method on the MSIConvertable interface to create one. -func New(data interface{}) Map { - if _, ok := data.(map[string]interface{}); !ok { - if converter, ok := data.(MSIConvertable); ok { - data = converter.MSI() - } else { - return nil - } - } - return Map(data.(map[string]interface{})) -} - -// MSI creates a map[string]interface{} and puts it inside a new Map. -// -// The arguments follow a key, value pattern. -// -// Panics -// -// Panics if any key arugment is non-string or if there are an odd number of arguments. -// -// Example -// -// To easily create Maps: -// -// m := objx.MSI("name", "Mat", "age", 29, "subobj", objx.MSI("active", true)) -// -// // creates an Map equivalent to -// m := objx.New(map[string]interface{}{"name": "Mat", "age": 29, "subobj": map[string]interface{}{"active": true}}) -func MSI(keyAndValuePairs ...interface{}) Map { - - newMap := make(map[string]interface{}) - keyAndValuePairsLen := len(keyAndValuePairs) - - if keyAndValuePairsLen%2 != 0 { - panic("objx: MSI must have an even number of arguments following the 'key, value' pattern.") - } - - for i := 0; i < keyAndValuePairsLen; i = i + 2 { - - key := keyAndValuePairs[i] - value := keyAndValuePairs[i+1] - - // make sure the key is a string - keyString, keyStringOK := key.(string) - if !keyStringOK { - panic("objx: MSI must follow 'string, interface{}' pattern. " + keyString + " is not a valid key.") - } - - newMap[keyString] = value - - } - - return New(newMap) -} - -// ****** Conversion Constructors - -// MustFromJSON creates a new Map containing the data specified in the -// jsonString. -// -// Panics if the JSON is invalid. -func MustFromJSON(jsonString string) Map { - o, err := FromJSON(jsonString) - - if err != nil { - panic("objx: MustFromJSON failed with error: " + err.Error()) - } - - return o -} - -// FromJSON creates a new Map containing the data specified in the -// jsonString. -// -// Returns an error if the JSON is invalid. -func FromJSON(jsonString string) (Map, error) { - - var data interface{} - err := json.Unmarshal([]byte(jsonString), &data) - - if err != nil { - return Nil, err - } - - return New(data), nil - -} - -// FromBase64 creates a new Obj containing the data specified -// in the Base64 string. -// -// The string is an encoded JSON string returned by Base64 -func FromBase64(base64String string) (Map, error) { - - decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String)) - - decoded, err := ioutil.ReadAll(decoder) - if err != nil { - return nil, err - } - - return FromJSON(string(decoded)) -} - -// MustFromBase64 creates a new Obj containing the data specified -// in the Base64 string and panics if there is an error. -// -// The string is an encoded JSON string returned by Base64 -func MustFromBase64(base64String string) Map { - - result, err := FromBase64(base64String) - - if err != nil { - panic("objx: MustFromBase64 failed with error: " + err.Error()) - } - - return result -} - -// FromSignedBase64 creates a new Obj containing the data specified -// in the Base64 string. -// -// The string is an encoded JSON string returned by SignedBase64 -func FromSignedBase64(base64String, key string) (Map, error) { - parts := strings.Split(base64String, SignatureSeparator) - if len(parts) != 2 { - return nil, errors.New("objx: Signed base64 string is malformed.") - } - - sig := HashWithKey(parts[0], key) - if parts[1] != sig { - return nil, errors.New("objx: Signature for base64 data does not match.") - } - - return FromBase64(parts[0]) -} - -// MustFromSignedBase64 creates a new Obj containing the data specified -// in the Base64 string and panics if there is an error. -// -// The string is an encoded JSON string returned by Base64 -func MustFromSignedBase64(base64String, key string) Map { - - result, err := FromSignedBase64(base64String, key) - - if err != nil { - panic("objx: MustFromSignedBase64 failed with error: " + err.Error()) - } - - return result -} - -// FromURLQuery generates a new Obj by parsing the specified -// query. -// -// For queries with multiple values, the first value is selected. -func FromURLQuery(query string) (Map, error) { - - vals, err := url.ParseQuery(query) - - if err != nil { - return nil, err - } - - m := make(map[string]interface{}) - for k, vals := range vals { - m[k] = vals[0] - } - - return New(m), nil -} - -// MustFromURLQuery generates a new Obj by parsing the specified -// query. -// -// For queries with multiple values, the first value is selected. -// -// Panics if it encounters an error -func MustFromURLQuery(query string) Map { - - o, err := FromURLQuery(query) - - if err != nil { - panic("objx: MustFromURLQuery failed with error: " + err.Error()) - } - - return o - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_for_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_for_test.go deleted file mode 100644 index 6beb50675..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_for_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package objx - -var TestMap map[string]interface{} = map[string]interface{}{ - "name": "Tyler", - "address": map[string]interface{}{ - "city": "Salt Lake City", - "state": "UT", - }, - "numbers": []interface{}{"one", "two", "three", "four", "five"}, -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_test.go deleted file mode 100644 index 1f8b45c61..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/map_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -type Convertable struct { - name string -} - -func (c *Convertable) MSI() map[string]interface{} { - return map[string]interface{}{"name": c.name} -} - -type Unconvertable struct { - name string -} - -func TestMapCreation(t *testing.T) { - - o := New(nil) - assert.Nil(t, o) - - o = New("Tyler") - assert.Nil(t, o) - - unconvertable := &Unconvertable{name: "Tyler"} - o = New(unconvertable) - assert.Nil(t, o) - - convertable := &Convertable{name: "Tyler"} - o = New(convertable) - if assert.NotNil(t, convertable) { - assert.Equal(t, "Tyler", o["name"], "Tyler") - } - - o = MSI() - if assert.NotNil(t, o) { - assert.NotNil(t, o) - } - - o = MSI("name", "Tyler") - if assert.NotNil(t, o) { - if assert.NotNil(t, o) { - assert.Equal(t, o["name"], "Tyler") - } - } - -} - -func TestMapMustFromJSONWithError(t *testing.T) { - - _, err := FromJSON(`"name":"Mat"}`) - assert.Error(t, err) - -} - -func TestMapFromJSON(t *testing.T) { - - o := MustFromJSON(`{"name":"Mat"}`) - - if assert.NotNil(t, o) { - if assert.NotNil(t, o) { - assert.Equal(t, "Mat", o["name"]) - } - } - -} - -func TestMapFromJSONWithError(t *testing.T) { - - var m Map - - assert.Panics(t, func() { - m = MustFromJSON(`"name":"Mat"}`) - }) - - assert.Nil(t, m) - -} - -func TestMapFromBase64String(t *testing.T) { - - base64String := "eyJuYW1lIjoiTWF0In0=" - - o, err := FromBase64(base64String) - - if assert.NoError(t, err) { - assert.Equal(t, o.Get("name").Str(), "Mat") - } - - assert.Equal(t, MustFromBase64(base64String).Get("name").Str(), "Mat") - -} - -func TestMapFromBase64StringWithError(t *testing.T) { - - base64String := "eyJuYW1lIjoiTWFasd0In0=" - - _, err := FromBase64(base64String) - - assert.Error(t, err) - - assert.Panics(t, func() { - MustFromBase64(base64String) - }) - -} - -func TestMapFromSignedBase64String(t *testing.T) { - - base64String := "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6" - - o, err := FromSignedBase64(base64String, "key") - - if assert.NoError(t, err) { - assert.Equal(t, o.Get("name").Str(), "Mat") - } - - assert.Equal(t, MustFromSignedBase64(base64String, "key").Get("name").Str(), "Mat") - -} - -func TestMapFromSignedBase64StringWithError(t *testing.T) { - - base64String := "eyJuYW1lasdIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6" - - _, err := FromSignedBase64(base64String, "key") - - assert.Error(t, err) - - assert.Panics(t, func() { - MustFromSignedBase64(base64String, "key") - }) - -} - -func TestMapFromURLQuery(t *testing.T) { - - m, err := FromURLQuery("name=tyler&state=UT") - if assert.NoError(t, err) && assert.NotNil(t, m) { - assert.Equal(t, "tyler", m.Get("name").Str()) - assert.Equal(t, "UT", m.Get("state").Str()) - } - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations.go deleted file mode 100644 index b35c86392..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations.go +++ /dev/null @@ -1,81 +0,0 @@ -package objx - -// Exclude returns a new Map with the keys in the specified []string -// excluded. -func (d Map) Exclude(exclude []string) Map { - - excluded := make(Map) - for k, v := range d { - var shouldInclude bool = true - for _, toExclude := range exclude { - if k == toExclude { - shouldInclude = false - break - } - } - if shouldInclude { - excluded[k] = v - } - } - - return excluded -} - -// Copy creates a shallow copy of the Obj. -func (m Map) Copy() Map { - copied := make(map[string]interface{}) - for k, v := range m { - copied[k] = v - } - return New(copied) -} - -// Merge blends the specified map with a copy of this map and returns the result. -// -// Keys that appear in both will be selected from the specified map. -// This method requires that the wrapped object be a map[string]interface{} -func (m Map) Merge(merge Map) Map { - return m.Copy().MergeHere(merge) -} - -// Merge blends the specified map with this map and returns the current map. -// -// Keys that appear in both will be selected from the specified map. The original map -// will be modified. This method requires that -// the wrapped object be a map[string]interface{} -func (m Map) MergeHere(merge Map) Map { - - for k, v := range merge { - m[k] = v - } - - return m - -} - -// Transform builds a new Obj giving the transformer a chance -// to change the keys and values as it goes. This method requires that -// the wrapped object be a map[string]interface{} -func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map { - newMap := make(map[string]interface{}) - for k, v := range m { - modifiedKey, modifiedVal := transformer(k, v) - newMap[modifiedKey] = modifiedVal - } - return New(newMap) -} - -// TransformKeys builds a new map using the specified key mapping. -// -// Unspecified keys will be unaltered. -// This method requires that the wrapped object be a map[string]interface{} -func (m Map) TransformKeys(mapping map[string]string) Map { - return m.Transform(func(key string, value interface{}) (string, interface{}) { - - if newKey, ok := mapping[key]; ok { - return newKey, value - } - - return key, value - }) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations_test.go deleted file mode 100644 index e20ee23bc..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/mutations_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestExclude(t *testing.T) { - - d := make(Map) - d["name"] = "Mat" - d["age"] = 29 - d["secret"] = "ABC" - - excluded := d.Exclude([]string{"secret"}) - - assert.Equal(t, d["name"], excluded["name"]) - assert.Equal(t, d["age"], excluded["age"]) - assert.False(t, excluded.Has("secret"), "secret should be excluded") - -} - -func TestCopy(t *testing.T) { - - d1 := make(map[string]interface{}) - d1["name"] = "Tyler" - d1["location"] = "UT" - - d1Obj := New(d1) - d2Obj := d1Obj.Copy() - - d2Obj["name"] = "Mat" - - assert.Equal(t, d1Obj.Get("name").Str(), "Tyler") - assert.Equal(t, d2Obj.Get("name").Str(), "Mat") - -} - -func TestMerge(t *testing.T) { - - d := make(map[string]interface{}) - d["name"] = "Mat" - - d1 := make(map[string]interface{}) - d1["name"] = "Tyler" - d1["location"] = "UT" - - dObj := New(d) - d1Obj := New(d1) - - merged := dObj.Merge(d1Obj) - - assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str()) - assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str()) - assert.Empty(t, dObj.Get("location").Str()) - -} - -func TestMergeHere(t *testing.T) { - - d := make(map[string]interface{}) - d["name"] = "Mat" - - d1 := make(map[string]interface{}) - d1["name"] = "Tyler" - d1["location"] = "UT" - - dObj := New(d) - d1Obj := New(d1) - - merged := dObj.MergeHere(d1Obj) - - assert.Equal(t, dObj, merged, "With MergeHere, it should return the first modified map") - assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str()) - assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str()) - assert.Equal(t, merged.Get("location").Str(), dObj.Get("location").Str()) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security.go deleted file mode 100644 index fdd6be9cf..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security.go +++ /dev/null @@ -1,14 +0,0 @@ -package objx - -import ( - "crypto/sha1" - "encoding/hex" -) - -// HashWithKey hashes the specified string using the security -// key. -func HashWithKey(data, key string) string { - hash := sha1.New() - hash.Write([]byte(data + ":" + key)) - return hex.EncodeToString(hash.Sum(nil)) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security_test.go deleted file mode 100644 index 8f0898f62..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/security_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestHashWithKey(t *testing.T) { - - assert.Equal(t, "0ce84d8d01f2c7b6e0882b784429c54d280ea2d9", HashWithKey("abc", "def")) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/simple_example_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/simple_example_test.go deleted file mode 100644 index 5408c7fd3..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/simple_example_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestSimpleExample(t *testing.T) { - - // build a map from a JSON object - o := MustFromJSON(`{"name":"Mat","foods":["indian","chinese"], "location":{"county":"hobbiton","city":"the shire"}}`) - - // Map can be used as a straight map[string]interface{} - assert.Equal(t, o["name"], "Mat") - - // Get an Value object - v := o.Get("name") - assert.Equal(t, v, &Value{data: "Mat"}) - - // Test the contained value - assert.False(t, v.IsInt()) - assert.False(t, v.IsBool()) - assert.True(t, v.IsStr()) - - // Get the contained value - assert.Equal(t, v.Str(), "Mat") - - // Get a default value if the contained value is not of the expected type or does not exist - assert.Equal(t, 1, v.Int(1)) - - // Get a value by using array notation - assert.Equal(t, "indian", o.Get("foods[0]").Data()) - - // Set a value by using array notation - o.Set("foods[0]", "italian") - assert.Equal(t, "italian", o.Get("foods[0]").Str()) - - // Get a value by using dot notation - assert.Equal(t, "hobbiton", o.Get("location.county").Str()) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests.go deleted file mode 100644 index d9e0b479a..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests.go +++ /dev/null @@ -1,17 +0,0 @@ -package objx - -// Has gets whether there is something at the specified selector -// or not. -// -// If m is nil, Has will always return false. -func (m Map) Has(selector string) bool { - if m == nil { - return false - } - return !m.Get(selector).IsNil() -} - -// IsNil gets whether the data is nil or not. -func (v *Value) IsNil() bool { - return v == nil || v.data == nil -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests_test.go deleted file mode 100644 index bcc1eb03d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/tests_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package objx - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestHas(t *testing.T) { - - m := New(TestMap) - - assert.True(t, m.Has("name")) - assert.True(t, m.Has("address.state")) - assert.True(t, m.Has("numbers[4]")) - - assert.False(t, m.Has("address.state.nope")) - assert.False(t, m.Has("address.nope")) - assert.False(t, m.Has("nope")) - assert.False(t, m.Has("numbers[5]")) - - m = nil - assert.False(t, m.Has("nothing")) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen.go deleted file mode 100644 index f3ecb29b9..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen.go +++ /dev/null @@ -1,2881 +0,0 @@ -package objx - -/* - Inter (interface{} and []interface{}) - -------------------------------------------------- -*/ - -// Inter gets the value as a interface{}, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Inter(optionalDefault ...interface{}) interface{} { - if s, ok := v.data.(interface{}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInter gets the value as a interface{}. -// -// Panics if the object is not a interface{}. -func (v *Value) MustInter() interface{} { - return v.data.(interface{}) -} - -// InterSlice gets the value as a []interface{}, returns the optionalDefault -// value or nil if the value is not a []interface{}. -func (v *Value) InterSlice(optionalDefault ...[]interface{}) []interface{} { - if s, ok := v.data.([]interface{}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInterSlice gets the value as a []interface{}. -// -// Panics if the object is not a []interface{}. -func (v *Value) MustInterSlice() []interface{} { - return v.data.([]interface{}) -} - -// IsInter gets whether the object contained is a interface{} or not. -func (v *Value) IsInter() bool { - _, ok := v.data.(interface{}) - return ok -} - -// IsInterSlice gets whether the object contained is a []interface{} or not. -func (v *Value) IsInterSlice() bool { - _, ok := v.data.([]interface{}) - return ok -} - -// EachInter calls the specified callback for each object -// in the []interface{}. -// -// Panics if the object is the wrong type. -func (v *Value) EachInter(callback func(int, interface{}) bool) *Value { - - for index, val := range v.MustInterSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInter uses the specified decider function to select items -// from the []interface{}. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInter(decider func(int, interface{}) bool) *Value { - - var selected []interface{} - - v.EachInter(func(index int, val interface{}) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInter uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]interface{}. -func (v *Value) GroupInter(grouper func(int, interface{}) string) *Value { - - groups := make(map[string][]interface{}) - - v.EachInter(func(index int, val interface{}) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]interface{}, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInter uses the specified function to replace each interface{}s -// by iterating each item. The data in the returned result will be a -// []interface{} containing the replaced items. -func (v *Value) ReplaceInter(replacer func(int, interface{}) interface{}) *Value { - - arr := v.MustInterSlice() - replaced := make([]interface{}, len(arr)) - - v.EachInter(func(index int, val interface{}) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInter uses the specified collector function to collect a value -// for each of the interface{}s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInter(collector func(int, interface{}) interface{}) *Value { - - arr := v.MustInterSlice() - collected := make([]interface{}, len(arr)) - - v.EachInter(func(index int, val interface{}) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - MSI (map[string]interface{} and []map[string]interface{}) - -------------------------------------------------- -*/ - -// MSI gets the value as a map[string]interface{}, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} { - if s, ok := v.data.(map[string]interface{}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustMSI gets the value as a map[string]interface{}. -// -// Panics if the object is not a map[string]interface{}. -func (v *Value) MustMSI() map[string]interface{} { - return v.data.(map[string]interface{}) -} - -// MSISlice gets the value as a []map[string]interface{}, returns the optionalDefault -// value or nil if the value is not a []map[string]interface{}. -func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} { - if s, ok := v.data.([]map[string]interface{}); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustMSISlice gets the value as a []map[string]interface{}. -// -// Panics if the object is not a []map[string]interface{}. -func (v *Value) MustMSISlice() []map[string]interface{} { - return v.data.([]map[string]interface{}) -} - -// IsMSI gets whether the object contained is a map[string]interface{} or not. -func (v *Value) IsMSI() bool { - _, ok := v.data.(map[string]interface{}) - return ok -} - -// IsMSISlice gets whether the object contained is a []map[string]interface{} or not. -func (v *Value) IsMSISlice() bool { - _, ok := v.data.([]map[string]interface{}) - return ok -} - -// EachMSI calls the specified callback for each object -// in the []map[string]interface{}. -// -// Panics if the object is the wrong type. -func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value { - - for index, val := range v.MustMSISlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereMSI uses the specified decider function to select items -// from the []map[string]interface{}. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value { - - var selected []map[string]interface{} - - v.EachMSI(func(index int, val map[string]interface{}) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupMSI uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]map[string]interface{}. -func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value { - - groups := make(map[string][]map[string]interface{}) - - v.EachMSI(func(index int, val map[string]interface{}) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]map[string]interface{}, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceMSI uses the specified function to replace each map[string]interface{}s -// by iterating each item. The data in the returned result will be a -// []map[string]interface{} containing the replaced items. -func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value { - - arr := v.MustMSISlice() - replaced := make([]map[string]interface{}, len(arr)) - - v.EachMSI(func(index int, val map[string]interface{}) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectMSI uses the specified collector function to collect a value -// for each of the map[string]interface{}s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value { - - arr := v.MustMSISlice() - collected := make([]interface{}, len(arr)) - - v.EachMSI(func(index int, val map[string]interface{}) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - ObjxMap ((Map) and [](Map)) - -------------------------------------------------- -*/ - -// ObjxMap gets the value as a (Map), returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) ObjxMap(optionalDefault ...(Map)) Map { - if s, ok := v.data.((Map)); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return New(nil) -} - -// MustObjxMap gets the value as a (Map). -// -// Panics if the object is not a (Map). -func (v *Value) MustObjxMap() Map { - return v.data.((Map)) -} - -// ObjxMapSlice gets the value as a [](Map), returns the optionalDefault -// value or nil if the value is not a [](Map). -func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) { - if s, ok := v.data.([](Map)); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustObjxMapSlice gets the value as a [](Map). -// -// Panics if the object is not a [](Map). -func (v *Value) MustObjxMapSlice() [](Map) { - return v.data.([](Map)) -} - -// IsObjxMap gets whether the object contained is a (Map) or not. -func (v *Value) IsObjxMap() bool { - _, ok := v.data.((Map)) - return ok -} - -// IsObjxMapSlice gets whether the object contained is a [](Map) or not. -func (v *Value) IsObjxMapSlice() bool { - _, ok := v.data.([](Map)) - return ok -} - -// EachObjxMap calls the specified callback for each object -// in the [](Map). -// -// Panics if the object is the wrong type. -func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value { - - for index, val := range v.MustObjxMapSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereObjxMap uses the specified decider function to select items -// from the [](Map). The object contained in the result will contain -// only the selected items. -func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value { - - var selected [](Map) - - v.EachObjxMap(func(index int, val Map) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupObjxMap uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][](Map). -func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value { - - groups := make(map[string][](Map)) - - v.EachObjxMap(func(index int, val Map) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([](Map), 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceObjxMap uses the specified function to replace each (Map)s -// by iterating each item. The data in the returned result will be a -// [](Map) containing the replaced items. -func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value { - - arr := v.MustObjxMapSlice() - replaced := make([](Map), len(arr)) - - v.EachObjxMap(func(index int, val Map) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectObjxMap uses the specified collector function to collect a value -// for each of the (Map)s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value { - - arr := v.MustObjxMapSlice() - collected := make([]interface{}, len(arr)) - - v.EachObjxMap(func(index int, val Map) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Bool (bool and []bool) - -------------------------------------------------- -*/ - -// Bool gets the value as a bool, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Bool(optionalDefault ...bool) bool { - if s, ok := v.data.(bool); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return false -} - -// MustBool gets the value as a bool. -// -// Panics if the object is not a bool. -func (v *Value) MustBool() bool { - return v.data.(bool) -} - -// BoolSlice gets the value as a []bool, returns the optionalDefault -// value or nil if the value is not a []bool. -func (v *Value) BoolSlice(optionalDefault ...[]bool) []bool { - if s, ok := v.data.([]bool); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustBoolSlice gets the value as a []bool. -// -// Panics if the object is not a []bool. -func (v *Value) MustBoolSlice() []bool { - return v.data.([]bool) -} - -// IsBool gets whether the object contained is a bool or not. -func (v *Value) IsBool() bool { - _, ok := v.data.(bool) - return ok -} - -// IsBoolSlice gets whether the object contained is a []bool or not. -func (v *Value) IsBoolSlice() bool { - _, ok := v.data.([]bool) - return ok -} - -// EachBool calls the specified callback for each object -// in the []bool. -// -// Panics if the object is the wrong type. -func (v *Value) EachBool(callback func(int, bool) bool) *Value { - - for index, val := range v.MustBoolSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereBool uses the specified decider function to select items -// from the []bool. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereBool(decider func(int, bool) bool) *Value { - - var selected []bool - - v.EachBool(func(index int, val bool) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupBool uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]bool. -func (v *Value) GroupBool(grouper func(int, bool) string) *Value { - - groups := make(map[string][]bool) - - v.EachBool(func(index int, val bool) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]bool, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceBool uses the specified function to replace each bools -// by iterating each item. The data in the returned result will be a -// []bool containing the replaced items. -func (v *Value) ReplaceBool(replacer func(int, bool) bool) *Value { - - arr := v.MustBoolSlice() - replaced := make([]bool, len(arr)) - - v.EachBool(func(index int, val bool) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectBool uses the specified collector function to collect a value -// for each of the bools in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectBool(collector func(int, bool) interface{}) *Value { - - arr := v.MustBoolSlice() - collected := make([]interface{}, len(arr)) - - v.EachBool(func(index int, val bool) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Str (string and []string) - -------------------------------------------------- -*/ - -// Str gets the value as a string, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Str(optionalDefault ...string) string { - if s, ok := v.data.(string); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return "" -} - -// MustStr gets the value as a string. -// -// Panics if the object is not a string. -func (v *Value) MustStr() string { - return v.data.(string) -} - -// StrSlice gets the value as a []string, returns the optionalDefault -// value or nil if the value is not a []string. -func (v *Value) StrSlice(optionalDefault ...[]string) []string { - if s, ok := v.data.([]string); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustStrSlice gets the value as a []string. -// -// Panics if the object is not a []string. -func (v *Value) MustStrSlice() []string { - return v.data.([]string) -} - -// IsStr gets whether the object contained is a string or not. -func (v *Value) IsStr() bool { - _, ok := v.data.(string) - return ok -} - -// IsStrSlice gets whether the object contained is a []string or not. -func (v *Value) IsStrSlice() bool { - _, ok := v.data.([]string) - return ok -} - -// EachStr calls the specified callback for each object -// in the []string. -// -// Panics if the object is the wrong type. -func (v *Value) EachStr(callback func(int, string) bool) *Value { - - for index, val := range v.MustStrSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereStr uses the specified decider function to select items -// from the []string. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereStr(decider func(int, string) bool) *Value { - - var selected []string - - v.EachStr(func(index int, val string) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupStr uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]string. -func (v *Value) GroupStr(grouper func(int, string) string) *Value { - - groups := make(map[string][]string) - - v.EachStr(func(index int, val string) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]string, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceStr uses the specified function to replace each strings -// by iterating each item. The data in the returned result will be a -// []string containing the replaced items. -func (v *Value) ReplaceStr(replacer func(int, string) string) *Value { - - arr := v.MustStrSlice() - replaced := make([]string, len(arr)) - - v.EachStr(func(index int, val string) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectStr uses the specified collector function to collect a value -// for each of the strings in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectStr(collector func(int, string) interface{}) *Value { - - arr := v.MustStrSlice() - collected := make([]interface{}, len(arr)) - - v.EachStr(func(index int, val string) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Int (int and []int) - -------------------------------------------------- -*/ - -// Int gets the value as a int, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Int(optionalDefault ...int) int { - if s, ok := v.data.(int); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustInt gets the value as a int. -// -// Panics if the object is not a int. -func (v *Value) MustInt() int { - return v.data.(int) -} - -// IntSlice gets the value as a []int, returns the optionalDefault -// value or nil if the value is not a []int. -func (v *Value) IntSlice(optionalDefault ...[]int) []int { - if s, ok := v.data.([]int); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustIntSlice gets the value as a []int. -// -// Panics if the object is not a []int. -func (v *Value) MustIntSlice() []int { - return v.data.([]int) -} - -// IsInt gets whether the object contained is a int or not. -func (v *Value) IsInt() bool { - _, ok := v.data.(int) - return ok -} - -// IsIntSlice gets whether the object contained is a []int or not. -func (v *Value) IsIntSlice() bool { - _, ok := v.data.([]int) - return ok -} - -// EachInt calls the specified callback for each object -// in the []int. -// -// Panics if the object is the wrong type. -func (v *Value) EachInt(callback func(int, int) bool) *Value { - - for index, val := range v.MustIntSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInt uses the specified decider function to select items -// from the []int. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInt(decider func(int, int) bool) *Value { - - var selected []int - - v.EachInt(func(index int, val int) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInt uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]int. -func (v *Value) GroupInt(grouper func(int, int) string) *Value { - - groups := make(map[string][]int) - - v.EachInt(func(index int, val int) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]int, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInt uses the specified function to replace each ints -// by iterating each item. The data in the returned result will be a -// []int containing the replaced items. -func (v *Value) ReplaceInt(replacer func(int, int) int) *Value { - - arr := v.MustIntSlice() - replaced := make([]int, len(arr)) - - v.EachInt(func(index int, val int) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInt uses the specified collector function to collect a value -// for each of the ints in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInt(collector func(int, int) interface{}) *Value { - - arr := v.MustIntSlice() - collected := make([]interface{}, len(arr)) - - v.EachInt(func(index int, val int) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Int8 (int8 and []int8) - -------------------------------------------------- -*/ - -// Int8 gets the value as a int8, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Int8(optionalDefault ...int8) int8 { - if s, ok := v.data.(int8); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustInt8 gets the value as a int8. -// -// Panics if the object is not a int8. -func (v *Value) MustInt8() int8 { - return v.data.(int8) -} - -// Int8Slice gets the value as a []int8, returns the optionalDefault -// value or nil if the value is not a []int8. -func (v *Value) Int8Slice(optionalDefault ...[]int8) []int8 { - if s, ok := v.data.([]int8); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInt8Slice gets the value as a []int8. -// -// Panics if the object is not a []int8. -func (v *Value) MustInt8Slice() []int8 { - return v.data.([]int8) -} - -// IsInt8 gets whether the object contained is a int8 or not. -func (v *Value) IsInt8() bool { - _, ok := v.data.(int8) - return ok -} - -// IsInt8Slice gets whether the object contained is a []int8 or not. -func (v *Value) IsInt8Slice() bool { - _, ok := v.data.([]int8) - return ok -} - -// EachInt8 calls the specified callback for each object -// in the []int8. -// -// Panics if the object is the wrong type. -func (v *Value) EachInt8(callback func(int, int8) bool) *Value { - - for index, val := range v.MustInt8Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInt8 uses the specified decider function to select items -// from the []int8. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInt8(decider func(int, int8) bool) *Value { - - var selected []int8 - - v.EachInt8(func(index int, val int8) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInt8 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]int8. -func (v *Value) GroupInt8(grouper func(int, int8) string) *Value { - - groups := make(map[string][]int8) - - v.EachInt8(func(index int, val int8) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]int8, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInt8 uses the specified function to replace each int8s -// by iterating each item. The data in the returned result will be a -// []int8 containing the replaced items. -func (v *Value) ReplaceInt8(replacer func(int, int8) int8) *Value { - - arr := v.MustInt8Slice() - replaced := make([]int8, len(arr)) - - v.EachInt8(func(index int, val int8) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInt8 uses the specified collector function to collect a value -// for each of the int8s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInt8(collector func(int, int8) interface{}) *Value { - - arr := v.MustInt8Slice() - collected := make([]interface{}, len(arr)) - - v.EachInt8(func(index int, val int8) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Int16 (int16 and []int16) - -------------------------------------------------- -*/ - -// Int16 gets the value as a int16, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Int16(optionalDefault ...int16) int16 { - if s, ok := v.data.(int16); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustInt16 gets the value as a int16. -// -// Panics if the object is not a int16. -func (v *Value) MustInt16() int16 { - return v.data.(int16) -} - -// Int16Slice gets the value as a []int16, returns the optionalDefault -// value or nil if the value is not a []int16. -func (v *Value) Int16Slice(optionalDefault ...[]int16) []int16 { - if s, ok := v.data.([]int16); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInt16Slice gets the value as a []int16. -// -// Panics if the object is not a []int16. -func (v *Value) MustInt16Slice() []int16 { - return v.data.([]int16) -} - -// IsInt16 gets whether the object contained is a int16 or not. -func (v *Value) IsInt16() bool { - _, ok := v.data.(int16) - return ok -} - -// IsInt16Slice gets whether the object contained is a []int16 or not. -func (v *Value) IsInt16Slice() bool { - _, ok := v.data.([]int16) - return ok -} - -// EachInt16 calls the specified callback for each object -// in the []int16. -// -// Panics if the object is the wrong type. -func (v *Value) EachInt16(callback func(int, int16) bool) *Value { - - for index, val := range v.MustInt16Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInt16 uses the specified decider function to select items -// from the []int16. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInt16(decider func(int, int16) bool) *Value { - - var selected []int16 - - v.EachInt16(func(index int, val int16) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInt16 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]int16. -func (v *Value) GroupInt16(grouper func(int, int16) string) *Value { - - groups := make(map[string][]int16) - - v.EachInt16(func(index int, val int16) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]int16, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInt16 uses the specified function to replace each int16s -// by iterating each item. The data in the returned result will be a -// []int16 containing the replaced items. -func (v *Value) ReplaceInt16(replacer func(int, int16) int16) *Value { - - arr := v.MustInt16Slice() - replaced := make([]int16, len(arr)) - - v.EachInt16(func(index int, val int16) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInt16 uses the specified collector function to collect a value -// for each of the int16s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInt16(collector func(int, int16) interface{}) *Value { - - arr := v.MustInt16Slice() - collected := make([]interface{}, len(arr)) - - v.EachInt16(func(index int, val int16) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Int32 (int32 and []int32) - -------------------------------------------------- -*/ - -// Int32 gets the value as a int32, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Int32(optionalDefault ...int32) int32 { - if s, ok := v.data.(int32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustInt32 gets the value as a int32. -// -// Panics if the object is not a int32. -func (v *Value) MustInt32() int32 { - return v.data.(int32) -} - -// Int32Slice gets the value as a []int32, returns the optionalDefault -// value or nil if the value is not a []int32. -func (v *Value) Int32Slice(optionalDefault ...[]int32) []int32 { - if s, ok := v.data.([]int32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInt32Slice gets the value as a []int32. -// -// Panics if the object is not a []int32. -func (v *Value) MustInt32Slice() []int32 { - return v.data.([]int32) -} - -// IsInt32 gets whether the object contained is a int32 or not. -func (v *Value) IsInt32() bool { - _, ok := v.data.(int32) - return ok -} - -// IsInt32Slice gets whether the object contained is a []int32 or not. -func (v *Value) IsInt32Slice() bool { - _, ok := v.data.([]int32) - return ok -} - -// EachInt32 calls the specified callback for each object -// in the []int32. -// -// Panics if the object is the wrong type. -func (v *Value) EachInt32(callback func(int, int32) bool) *Value { - - for index, val := range v.MustInt32Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInt32 uses the specified decider function to select items -// from the []int32. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInt32(decider func(int, int32) bool) *Value { - - var selected []int32 - - v.EachInt32(func(index int, val int32) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInt32 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]int32. -func (v *Value) GroupInt32(grouper func(int, int32) string) *Value { - - groups := make(map[string][]int32) - - v.EachInt32(func(index int, val int32) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]int32, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInt32 uses the specified function to replace each int32s -// by iterating each item. The data in the returned result will be a -// []int32 containing the replaced items. -func (v *Value) ReplaceInt32(replacer func(int, int32) int32) *Value { - - arr := v.MustInt32Slice() - replaced := make([]int32, len(arr)) - - v.EachInt32(func(index int, val int32) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInt32 uses the specified collector function to collect a value -// for each of the int32s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInt32(collector func(int, int32) interface{}) *Value { - - arr := v.MustInt32Slice() - collected := make([]interface{}, len(arr)) - - v.EachInt32(func(index int, val int32) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Int64 (int64 and []int64) - -------------------------------------------------- -*/ - -// Int64 gets the value as a int64, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Int64(optionalDefault ...int64) int64 { - if s, ok := v.data.(int64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustInt64 gets the value as a int64. -// -// Panics if the object is not a int64. -func (v *Value) MustInt64() int64 { - return v.data.(int64) -} - -// Int64Slice gets the value as a []int64, returns the optionalDefault -// value or nil if the value is not a []int64. -func (v *Value) Int64Slice(optionalDefault ...[]int64) []int64 { - if s, ok := v.data.([]int64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustInt64Slice gets the value as a []int64. -// -// Panics if the object is not a []int64. -func (v *Value) MustInt64Slice() []int64 { - return v.data.([]int64) -} - -// IsInt64 gets whether the object contained is a int64 or not. -func (v *Value) IsInt64() bool { - _, ok := v.data.(int64) - return ok -} - -// IsInt64Slice gets whether the object contained is a []int64 or not. -func (v *Value) IsInt64Slice() bool { - _, ok := v.data.([]int64) - return ok -} - -// EachInt64 calls the specified callback for each object -// in the []int64. -// -// Panics if the object is the wrong type. -func (v *Value) EachInt64(callback func(int, int64) bool) *Value { - - for index, val := range v.MustInt64Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereInt64 uses the specified decider function to select items -// from the []int64. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereInt64(decider func(int, int64) bool) *Value { - - var selected []int64 - - v.EachInt64(func(index int, val int64) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupInt64 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]int64. -func (v *Value) GroupInt64(grouper func(int, int64) string) *Value { - - groups := make(map[string][]int64) - - v.EachInt64(func(index int, val int64) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]int64, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceInt64 uses the specified function to replace each int64s -// by iterating each item. The data in the returned result will be a -// []int64 containing the replaced items. -func (v *Value) ReplaceInt64(replacer func(int, int64) int64) *Value { - - arr := v.MustInt64Slice() - replaced := make([]int64, len(arr)) - - v.EachInt64(func(index int, val int64) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectInt64 uses the specified collector function to collect a value -// for each of the int64s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectInt64(collector func(int, int64) interface{}) *Value { - - arr := v.MustInt64Slice() - collected := make([]interface{}, len(arr)) - - v.EachInt64(func(index int, val int64) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uint (uint and []uint) - -------------------------------------------------- -*/ - -// Uint gets the value as a uint, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uint(optionalDefault ...uint) uint { - if s, ok := v.data.(uint); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUint gets the value as a uint. -// -// Panics if the object is not a uint. -func (v *Value) MustUint() uint { - return v.data.(uint) -} - -// UintSlice gets the value as a []uint, returns the optionalDefault -// value or nil if the value is not a []uint. -func (v *Value) UintSlice(optionalDefault ...[]uint) []uint { - if s, ok := v.data.([]uint); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUintSlice gets the value as a []uint. -// -// Panics if the object is not a []uint. -func (v *Value) MustUintSlice() []uint { - return v.data.([]uint) -} - -// IsUint gets whether the object contained is a uint or not. -func (v *Value) IsUint() bool { - _, ok := v.data.(uint) - return ok -} - -// IsUintSlice gets whether the object contained is a []uint or not. -func (v *Value) IsUintSlice() bool { - _, ok := v.data.([]uint) - return ok -} - -// EachUint calls the specified callback for each object -// in the []uint. -// -// Panics if the object is the wrong type. -func (v *Value) EachUint(callback func(int, uint) bool) *Value { - - for index, val := range v.MustUintSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUint uses the specified decider function to select items -// from the []uint. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUint(decider func(int, uint) bool) *Value { - - var selected []uint - - v.EachUint(func(index int, val uint) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUint uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uint. -func (v *Value) GroupUint(grouper func(int, uint) string) *Value { - - groups := make(map[string][]uint) - - v.EachUint(func(index int, val uint) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uint, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUint uses the specified function to replace each uints -// by iterating each item. The data in the returned result will be a -// []uint containing the replaced items. -func (v *Value) ReplaceUint(replacer func(int, uint) uint) *Value { - - arr := v.MustUintSlice() - replaced := make([]uint, len(arr)) - - v.EachUint(func(index int, val uint) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUint uses the specified collector function to collect a value -// for each of the uints in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUint(collector func(int, uint) interface{}) *Value { - - arr := v.MustUintSlice() - collected := make([]interface{}, len(arr)) - - v.EachUint(func(index int, val uint) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uint8 (uint8 and []uint8) - -------------------------------------------------- -*/ - -// Uint8 gets the value as a uint8, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uint8(optionalDefault ...uint8) uint8 { - if s, ok := v.data.(uint8); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUint8 gets the value as a uint8. -// -// Panics if the object is not a uint8. -func (v *Value) MustUint8() uint8 { - return v.data.(uint8) -} - -// Uint8Slice gets the value as a []uint8, returns the optionalDefault -// value or nil if the value is not a []uint8. -func (v *Value) Uint8Slice(optionalDefault ...[]uint8) []uint8 { - if s, ok := v.data.([]uint8); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUint8Slice gets the value as a []uint8. -// -// Panics if the object is not a []uint8. -func (v *Value) MustUint8Slice() []uint8 { - return v.data.([]uint8) -} - -// IsUint8 gets whether the object contained is a uint8 or not. -func (v *Value) IsUint8() bool { - _, ok := v.data.(uint8) - return ok -} - -// IsUint8Slice gets whether the object contained is a []uint8 or not. -func (v *Value) IsUint8Slice() bool { - _, ok := v.data.([]uint8) - return ok -} - -// EachUint8 calls the specified callback for each object -// in the []uint8. -// -// Panics if the object is the wrong type. -func (v *Value) EachUint8(callback func(int, uint8) bool) *Value { - - for index, val := range v.MustUint8Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUint8 uses the specified decider function to select items -// from the []uint8. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUint8(decider func(int, uint8) bool) *Value { - - var selected []uint8 - - v.EachUint8(func(index int, val uint8) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUint8 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uint8. -func (v *Value) GroupUint8(grouper func(int, uint8) string) *Value { - - groups := make(map[string][]uint8) - - v.EachUint8(func(index int, val uint8) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uint8, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUint8 uses the specified function to replace each uint8s -// by iterating each item. The data in the returned result will be a -// []uint8 containing the replaced items. -func (v *Value) ReplaceUint8(replacer func(int, uint8) uint8) *Value { - - arr := v.MustUint8Slice() - replaced := make([]uint8, len(arr)) - - v.EachUint8(func(index int, val uint8) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUint8 uses the specified collector function to collect a value -// for each of the uint8s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUint8(collector func(int, uint8) interface{}) *Value { - - arr := v.MustUint8Slice() - collected := make([]interface{}, len(arr)) - - v.EachUint8(func(index int, val uint8) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uint16 (uint16 and []uint16) - -------------------------------------------------- -*/ - -// Uint16 gets the value as a uint16, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uint16(optionalDefault ...uint16) uint16 { - if s, ok := v.data.(uint16); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUint16 gets the value as a uint16. -// -// Panics if the object is not a uint16. -func (v *Value) MustUint16() uint16 { - return v.data.(uint16) -} - -// Uint16Slice gets the value as a []uint16, returns the optionalDefault -// value or nil if the value is not a []uint16. -func (v *Value) Uint16Slice(optionalDefault ...[]uint16) []uint16 { - if s, ok := v.data.([]uint16); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUint16Slice gets the value as a []uint16. -// -// Panics if the object is not a []uint16. -func (v *Value) MustUint16Slice() []uint16 { - return v.data.([]uint16) -} - -// IsUint16 gets whether the object contained is a uint16 or not. -func (v *Value) IsUint16() bool { - _, ok := v.data.(uint16) - return ok -} - -// IsUint16Slice gets whether the object contained is a []uint16 or not. -func (v *Value) IsUint16Slice() bool { - _, ok := v.data.([]uint16) - return ok -} - -// EachUint16 calls the specified callback for each object -// in the []uint16. -// -// Panics if the object is the wrong type. -func (v *Value) EachUint16(callback func(int, uint16) bool) *Value { - - for index, val := range v.MustUint16Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUint16 uses the specified decider function to select items -// from the []uint16. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUint16(decider func(int, uint16) bool) *Value { - - var selected []uint16 - - v.EachUint16(func(index int, val uint16) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUint16 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uint16. -func (v *Value) GroupUint16(grouper func(int, uint16) string) *Value { - - groups := make(map[string][]uint16) - - v.EachUint16(func(index int, val uint16) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uint16, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUint16 uses the specified function to replace each uint16s -// by iterating each item. The data in the returned result will be a -// []uint16 containing the replaced items. -func (v *Value) ReplaceUint16(replacer func(int, uint16) uint16) *Value { - - arr := v.MustUint16Slice() - replaced := make([]uint16, len(arr)) - - v.EachUint16(func(index int, val uint16) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUint16 uses the specified collector function to collect a value -// for each of the uint16s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUint16(collector func(int, uint16) interface{}) *Value { - - arr := v.MustUint16Slice() - collected := make([]interface{}, len(arr)) - - v.EachUint16(func(index int, val uint16) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uint32 (uint32 and []uint32) - -------------------------------------------------- -*/ - -// Uint32 gets the value as a uint32, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uint32(optionalDefault ...uint32) uint32 { - if s, ok := v.data.(uint32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUint32 gets the value as a uint32. -// -// Panics if the object is not a uint32. -func (v *Value) MustUint32() uint32 { - return v.data.(uint32) -} - -// Uint32Slice gets the value as a []uint32, returns the optionalDefault -// value or nil if the value is not a []uint32. -func (v *Value) Uint32Slice(optionalDefault ...[]uint32) []uint32 { - if s, ok := v.data.([]uint32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUint32Slice gets the value as a []uint32. -// -// Panics if the object is not a []uint32. -func (v *Value) MustUint32Slice() []uint32 { - return v.data.([]uint32) -} - -// IsUint32 gets whether the object contained is a uint32 or not. -func (v *Value) IsUint32() bool { - _, ok := v.data.(uint32) - return ok -} - -// IsUint32Slice gets whether the object contained is a []uint32 or not. -func (v *Value) IsUint32Slice() bool { - _, ok := v.data.([]uint32) - return ok -} - -// EachUint32 calls the specified callback for each object -// in the []uint32. -// -// Panics if the object is the wrong type. -func (v *Value) EachUint32(callback func(int, uint32) bool) *Value { - - for index, val := range v.MustUint32Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUint32 uses the specified decider function to select items -// from the []uint32. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUint32(decider func(int, uint32) bool) *Value { - - var selected []uint32 - - v.EachUint32(func(index int, val uint32) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUint32 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uint32. -func (v *Value) GroupUint32(grouper func(int, uint32) string) *Value { - - groups := make(map[string][]uint32) - - v.EachUint32(func(index int, val uint32) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uint32, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUint32 uses the specified function to replace each uint32s -// by iterating each item. The data in the returned result will be a -// []uint32 containing the replaced items. -func (v *Value) ReplaceUint32(replacer func(int, uint32) uint32) *Value { - - arr := v.MustUint32Slice() - replaced := make([]uint32, len(arr)) - - v.EachUint32(func(index int, val uint32) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUint32 uses the specified collector function to collect a value -// for each of the uint32s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUint32(collector func(int, uint32) interface{}) *Value { - - arr := v.MustUint32Slice() - collected := make([]interface{}, len(arr)) - - v.EachUint32(func(index int, val uint32) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uint64 (uint64 and []uint64) - -------------------------------------------------- -*/ - -// Uint64 gets the value as a uint64, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uint64(optionalDefault ...uint64) uint64 { - if s, ok := v.data.(uint64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUint64 gets the value as a uint64. -// -// Panics if the object is not a uint64. -func (v *Value) MustUint64() uint64 { - return v.data.(uint64) -} - -// Uint64Slice gets the value as a []uint64, returns the optionalDefault -// value or nil if the value is not a []uint64. -func (v *Value) Uint64Slice(optionalDefault ...[]uint64) []uint64 { - if s, ok := v.data.([]uint64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUint64Slice gets the value as a []uint64. -// -// Panics if the object is not a []uint64. -func (v *Value) MustUint64Slice() []uint64 { - return v.data.([]uint64) -} - -// IsUint64 gets whether the object contained is a uint64 or not. -func (v *Value) IsUint64() bool { - _, ok := v.data.(uint64) - return ok -} - -// IsUint64Slice gets whether the object contained is a []uint64 or not. -func (v *Value) IsUint64Slice() bool { - _, ok := v.data.([]uint64) - return ok -} - -// EachUint64 calls the specified callback for each object -// in the []uint64. -// -// Panics if the object is the wrong type. -func (v *Value) EachUint64(callback func(int, uint64) bool) *Value { - - for index, val := range v.MustUint64Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUint64 uses the specified decider function to select items -// from the []uint64. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUint64(decider func(int, uint64) bool) *Value { - - var selected []uint64 - - v.EachUint64(func(index int, val uint64) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUint64 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uint64. -func (v *Value) GroupUint64(grouper func(int, uint64) string) *Value { - - groups := make(map[string][]uint64) - - v.EachUint64(func(index int, val uint64) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uint64, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUint64 uses the specified function to replace each uint64s -// by iterating each item. The data in the returned result will be a -// []uint64 containing the replaced items. -func (v *Value) ReplaceUint64(replacer func(int, uint64) uint64) *Value { - - arr := v.MustUint64Slice() - replaced := make([]uint64, len(arr)) - - v.EachUint64(func(index int, val uint64) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUint64 uses the specified collector function to collect a value -// for each of the uint64s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUint64(collector func(int, uint64) interface{}) *Value { - - arr := v.MustUint64Slice() - collected := make([]interface{}, len(arr)) - - v.EachUint64(func(index int, val uint64) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Uintptr (uintptr and []uintptr) - -------------------------------------------------- -*/ - -// Uintptr gets the value as a uintptr, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Uintptr(optionalDefault ...uintptr) uintptr { - if s, ok := v.data.(uintptr); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustUintptr gets the value as a uintptr. -// -// Panics if the object is not a uintptr. -func (v *Value) MustUintptr() uintptr { - return v.data.(uintptr) -} - -// UintptrSlice gets the value as a []uintptr, returns the optionalDefault -// value or nil if the value is not a []uintptr. -func (v *Value) UintptrSlice(optionalDefault ...[]uintptr) []uintptr { - if s, ok := v.data.([]uintptr); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustUintptrSlice gets the value as a []uintptr. -// -// Panics if the object is not a []uintptr. -func (v *Value) MustUintptrSlice() []uintptr { - return v.data.([]uintptr) -} - -// IsUintptr gets whether the object contained is a uintptr or not. -func (v *Value) IsUintptr() bool { - _, ok := v.data.(uintptr) - return ok -} - -// IsUintptrSlice gets whether the object contained is a []uintptr or not. -func (v *Value) IsUintptrSlice() bool { - _, ok := v.data.([]uintptr) - return ok -} - -// EachUintptr calls the specified callback for each object -// in the []uintptr. -// -// Panics if the object is the wrong type. -func (v *Value) EachUintptr(callback func(int, uintptr) bool) *Value { - - for index, val := range v.MustUintptrSlice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereUintptr uses the specified decider function to select items -// from the []uintptr. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereUintptr(decider func(int, uintptr) bool) *Value { - - var selected []uintptr - - v.EachUintptr(func(index int, val uintptr) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupUintptr uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]uintptr. -func (v *Value) GroupUintptr(grouper func(int, uintptr) string) *Value { - - groups := make(map[string][]uintptr) - - v.EachUintptr(func(index int, val uintptr) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]uintptr, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceUintptr uses the specified function to replace each uintptrs -// by iterating each item. The data in the returned result will be a -// []uintptr containing the replaced items. -func (v *Value) ReplaceUintptr(replacer func(int, uintptr) uintptr) *Value { - - arr := v.MustUintptrSlice() - replaced := make([]uintptr, len(arr)) - - v.EachUintptr(func(index int, val uintptr) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectUintptr uses the specified collector function to collect a value -// for each of the uintptrs in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectUintptr(collector func(int, uintptr) interface{}) *Value { - - arr := v.MustUintptrSlice() - collected := make([]interface{}, len(arr)) - - v.EachUintptr(func(index int, val uintptr) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Float32 (float32 and []float32) - -------------------------------------------------- -*/ - -// Float32 gets the value as a float32, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Float32(optionalDefault ...float32) float32 { - if s, ok := v.data.(float32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustFloat32 gets the value as a float32. -// -// Panics if the object is not a float32. -func (v *Value) MustFloat32() float32 { - return v.data.(float32) -} - -// Float32Slice gets the value as a []float32, returns the optionalDefault -// value or nil if the value is not a []float32. -func (v *Value) Float32Slice(optionalDefault ...[]float32) []float32 { - if s, ok := v.data.([]float32); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustFloat32Slice gets the value as a []float32. -// -// Panics if the object is not a []float32. -func (v *Value) MustFloat32Slice() []float32 { - return v.data.([]float32) -} - -// IsFloat32 gets whether the object contained is a float32 or not. -func (v *Value) IsFloat32() bool { - _, ok := v.data.(float32) - return ok -} - -// IsFloat32Slice gets whether the object contained is a []float32 or not. -func (v *Value) IsFloat32Slice() bool { - _, ok := v.data.([]float32) - return ok -} - -// EachFloat32 calls the specified callback for each object -// in the []float32. -// -// Panics if the object is the wrong type. -func (v *Value) EachFloat32(callback func(int, float32) bool) *Value { - - for index, val := range v.MustFloat32Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereFloat32 uses the specified decider function to select items -// from the []float32. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereFloat32(decider func(int, float32) bool) *Value { - - var selected []float32 - - v.EachFloat32(func(index int, val float32) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupFloat32 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]float32. -func (v *Value) GroupFloat32(grouper func(int, float32) string) *Value { - - groups := make(map[string][]float32) - - v.EachFloat32(func(index int, val float32) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]float32, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceFloat32 uses the specified function to replace each float32s -// by iterating each item. The data in the returned result will be a -// []float32 containing the replaced items. -func (v *Value) ReplaceFloat32(replacer func(int, float32) float32) *Value { - - arr := v.MustFloat32Slice() - replaced := make([]float32, len(arr)) - - v.EachFloat32(func(index int, val float32) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectFloat32 uses the specified collector function to collect a value -// for each of the float32s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectFloat32(collector func(int, float32) interface{}) *Value { - - arr := v.MustFloat32Slice() - collected := make([]interface{}, len(arr)) - - v.EachFloat32(func(index int, val float32) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Float64 (float64 and []float64) - -------------------------------------------------- -*/ - -// Float64 gets the value as a float64, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Float64(optionalDefault ...float64) float64 { - if s, ok := v.data.(float64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustFloat64 gets the value as a float64. -// -// Panics if the object is not a float64. -func (v *Value) MustFloat64() float64 { - return v.data.(float64) -} - -// Float64Slice gets the value as a []float64, returns the optionalDefault -// value or nil if the value is not a []float64. -func (v *Value) Float64Slice(optionalDefault ...[]float64) []float64 { - if s, ok := v.data.([]float64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustFloat64Slice gets the value as a []float64. -// -// Panics if the object is not a []float64. -func (v *Value) MustFloat64Slice() []float64 { - return v.data.([]float64) -} - -// IsFloat64 gets whether the object contained is a float64 or not. -func (v *Value) IsFloat64() bool { - _, ok := v.data.(float64) - return ok -} - -// IsFloat64Slice gets whether the object contained is a []float64 or not. -func (v *Value) IsFloat64Slice() bool { - _, ok := v.data.([]float64) - return ok -} - -// EachFloat64 calls the specified callback for each object -// in the []float64. -// -// Panics if the object is the wrong type. -func (v *Value) EachFloat64(callback func(int, float64) bool) *Value { - - for index, val := range v.MustFloat64Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereFloat64 uses the specified decider function to select items -// from the []float64. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereFloat64(decider func(int, float64) bool) *Value { - - var selected []float64 - - v.EachFloat64(func(index int, val float64) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupFloat64 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]float64. -func (v *Value) GroupFloat64(grouper func(int, float64) string) *Value { - - groups := make(map[string][]float64) - - v.EachFloat64(func(index int, val float64) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]float64, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceFloat64 uses the specified function to replace each float64s -// by iterating each item. The data in the returned result will be a -// []float64 containing the replaced items. -func (v *Value) ReplaceFloat64(replacer func(int, float64) float64) *Value { - - arr := v.MustFloat64Slice() - replaced := make([]float64, len(arr)) - - v.EachFloat64(func(index int, val float64) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectFloat64 uses the specified collector function to collect a value -// for each of the float64s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectFloat64(collector func(int, float64) interface{}) *Value { - - arr := v.MustFloat64Slice() - collected := make([]interface{}, len(arr)) - - v.EachFloat64(func(index int, val float64) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Complex64 (complex64 and []complex64) - -------------------------------------------------- -*/ - -// Complex64 gets the value as a complex64, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Complex64(optionalDefault ...complex64) complex64 { - if s, ok := v.data.(complex64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustComplex64 gets the value as a complex64. -// -// Panics if the object is not a complex64. -func (v *Value) MustComplex64() complex64 { - return v.data.(complex64) -} - -// Complex64Slice gets the value as a []complex64, returns the optionalDefault -// value or nil if the value is not a []complex64. -func (v *Value) Complex64Slice(optionalDefault ...[]complex64) []complex64 { - if s, ok := v.data.([]complex64); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustComplex64Slice gets the value as a []complex64. -// -// Panics if the object is not a []complex64. -func (v *Value) MustComplex64Slice() []complex64 { - return v.data.([]complex64) -} - -// IsComplex64 gets whether the object contained is a complex64 or not. -func (v *Value) IsComplex64() bool { - _, ok := v.data.(complex64) - return ok -} - -// IsComplex64Slice gets whether the object contained is a []complex64 or not. -func (v *Value) IsComplex64Slice() bool { - _, ok := v.data.([]complex64) - return ok -} - -// EachComplex64 calls the specified callback for each object -// in the []complex64. -// -// Panics if the object is the wrong type. -func (v *Value) EachComplex64(callback func(int, complex64) bool) *Value { - - for index, val := range v.MustComplex64Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereComplex64 uses the specified decider function to select items -// from the []complex64. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereComplex64(decider func(int, complex64) bool) *Value { - - var selected []complex64 - - v.EachComplex64(func(index int, val complex64) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupComplex64 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]complex64. -func (v *Value) GroupComplex64(grouper func(int, complex64) string) *Value { - - groups := make(map[string][]complex64) - - v.EachComplex64(func(index int, val complex64) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]complex64, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceComplex64 uses the specified function to replace each complex64s -// by iterating each item. The data in the returned result will be a -// []complex64 containing the replaced items. -func (v *Value) ReplaceComplex64(replacer func(int, complex64) complex64) *Value { - - arr := v.MustComplex64Slice() - replaced := make([]complex64, len(arr)) - - v.EachComplex64(func(index int, val complex64) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectComplex64 uses the specified collector function to collect a value -// for each of the complex64s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectComplex64(collector func(int, complex64) interface{}) *Value { - - arr := v.MustComplex64Slice() - collected := make([]interface{}, len(arr)) - - v.EachComplex64(func(index int, val complex64) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} - -/* - Complex128 (complex128 and []complex128) - -------------------------------------------------- -*/ - -// Complex128 gets the value as a complex128, returns the optionalDefault -// value or a system default object if the value is the wrong type. -func (v *Value) Complex128(optionalDefault ...complex128) complex128 { - if s, ok := v.data.(complex128); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return 0 -} - -// MustComplex128 gets the value as a complex128. -// -// Panics if the object is not a complex128. -func (v *Value) MustComplex128() complex128 { - return v.data.(complex128) -} - -// Complex128Slice gets the value as a []complex128, returns the optionalDefault -// value or nil if the value is not a []complex128. -func (v *Value) Complex128Slice(optionalDefault ...[]complex128) []complex128 { - if s, ok := v.data.([]complex128); ok { - return s - } - if len(optionalDefault) == 1 { - return optionalDefault[0] - } - return nil -} - -// MustComplex128Slice gets the value as a []complex128. -// -// Panics if the object is not a []complex128. -func (v *Value) MustComplex128Slice() []complex128 { - return v.data.([]complex128) -} - -// IsComplex128 gets whether the object contained is a complex128 or not. -func (v *Value) IsComplex128() bool { - _, ok := v.data.(complex128) - return ok -} - -// IsComplex128Slice gets whether the object contained is a []complex128 or not. -func (v *Value) IsComplex128Slice() bool { - _, ok := v.data.([]complex128) - return ok -} - -// EachComplex128 calls the specified callback for each object -// in the []complex128. -// -// Panics if the object is the wrong type. -func (v *Value) EachComplex128(callback func(int, complex128) bool) *Value { - - for index, val := range v.MustComplex128Slice() { - carryon := callback(index, val) - if carryon == false { - break - } - } - - return v - -} - -// WhereComplex128 uses the specified decider function to select items -// from the []complex128. The object contained in the result will contain -// only the selected items. -func (v *Value) WhereComplex128(decider func(int, complex128) bool) *Value { - - var selected []complex128 - - v.EachComplex128(func(index int, val complex128) bool { - shouldSelect := decider(index, val) - if shouldSelect == false { - selected = append(selected, val) - } - return true - }) - - return &Value{data: selected} - -} - -// GroupComplex128 uses the specified grouper function to group the items -// keyed by the return of the grouper. The object contained in the -// result will contain a map[string][]complex128. -func (v *Value) GroupComplex128(grouper func(int, complex128) string) *Value { - - groups := make(map[string][]complex128) - - v.EachComplex128(func(index int, val complex128) bool { - group := grouper(index, val) - if _, ok := groups[group]; !ok { - groups[group] = make([]complex128, 0) - } - groups[group] = append(groups[group], val) - return true - }) - - return &Value{data: groups} - -} - -// ReplaceComplex128 uses the specified function to replace each complex128s -// by iterating each item. The data in the returned result will be a -// []complex128 containing the replaced items. -func (v *Value) ReplaceComplex128(replacer func(int, complex128) complex128) *Value { - - arr := v.MustComplex128Slice() - replaced := make([]complex128, len(arr)) - - v.EachComplex128(func(index int, val complex128) bool { - replaced[index] = replacer(index, val) - return true - }) - - return &Value{data: replaced} - -} - -// CollectComplex128 uses the specified collector function to collect a value -// for each of the complex128s in the slice. The data returned will be a -// []interface{}. -func (v *Value) CollectComplex128(collector func(int, complex128) interface{}) *Value { - - arr := v.MustComplex128Slice() - collected := make([]interface{}, len(arr)) - - v.EachComplex128(func(index int, val complex128) bool { - collected[index] = collector(index, val) - return true - }) - - return &Value{data: collected} -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen_test.go deleted file mode 100644 index f7a4fceea..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/type_specific_codegen_test.go +++ /dev/null @@ -1,2867 +0,0 @@ -package objx - -import ( - "fmt" - "github.com/stretchr/testify/assert" - "testing" -) - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInter(t *testing.T) { - - val := interface{}("something") - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Inter()) - assert.Equal(t, val, New(m).Get("value").MustInter()) - assert.Equal(t, interface{}(nil), New(m).Get("nothing").Inter()) - assert.Equal(t, val, New(m).Get("nothing").Inter("something")) - - assert.Panics(t, func() { - New(m).Get("age").MustInter() - }) - -} - -func TestInterSlice(t *testing.T) { - - val := interface{}("something") - m := map[string]interface{}{"value": []interface{}{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").InterSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustInterSlice()[0]) - assert.Equal(t, []interface{}(nil), New(m).Get("nothing").InterSlice()) - assert.Equal(t, val, New(m).Get("nothing").InterSlice([]interface{}{interface{}("something")})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustInterSlice() - }) - -} - -func TestIsInter(t *testing.T) { - - var v *Value - - v = &Value{data: interface{}("something")} - assert.True(t, v.IsInter()) - - v = &Value{data: []interface{}{interface{}("something")}} - assert.True(t, v.IsInterSlice()) - -} - -func TestEachInter(t *testing.T) { - - v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} - count := 0 - replacedVals := make([]interface{}, 0) - assert.Equal(t, v, v.EachInter(func(i int, val interface{}) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustInterSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustInterSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustInterSlice()[2]) - -} - -func TestWhereInter(t *testing.T) { - - v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} - - selected := v.WhereInter(func(i int, val interface{}) bool { - return i%2 == 0 - }).MustInterSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInter(t *testing.T) { - - v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} - - grouped := v.GroupInter(func(i int, val interface{}) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]interface{}) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInter(t *testing.T) { - - v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} - - rawArr := v.MustInterSlice() - - replaced := v.ReplaceInter(func(index int, val interface{}) interface{} { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustInterSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInter(t *testing.T) { - - v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}} - - collected := v.CollectInter(func(index int, val interface{}) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestMSI(t *testing.T) { - - val := map[string]interface{}(map[string]interface{}{"name": "Tyler"}) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").MSI()) - assert.Equal(t, val, New(m).Get("value").MustMSI()) - assert.Equal(t, map[string]interface{}(nil), New(m).Get("nothing").MSI()) - assert.Equal(t, val, New(m).Get("nothing").MSI(map[string]interface{}{"name": "Tyler"})) - - assert.Panics(t, func() { - New(m).Get("age").MustMSI() - }) - -} - -func TestMSISlice(t *testing.T) { - - val := map[string]interface{}(map[string]interface{}{"name": "Tyler"}) - m := map[string]interface{}{"value": []map[string]interface{}{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").MSISlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustMSISlice()[0]) - assert.Equal(t, []map[string]interface{}(nil), New(m).Get("nothing").MSISlice()) - assert.Equal(t, val, New(m).Get("nothing").MSISlice([]map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustMSISlice() - }) - -} - -func TestIsMSI(t *testing.T) { - - var v *Value - - v = &Value{data: map[string]interface{}(map[string]interface{}{"name": "Tyler"})} - assert.True(t, v.IsMSI()) - - v = &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - assert.True(t, v.IsMSISlice()) - -} - -func TestEachMSI(t *testing.T) { - - v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - count := 0 - replacedVals := make([]map[string]interface{}, 0) - assert.Equal(t, v, v.EachMSI(func(i int, val map[string]interface{}) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustMSISlice()[0]) - assert.Equal(t, replacedVals[1], v.MustMSISlice()[1]) - assert.Equal(t, replacedVals[2], v.MustMSISlice()[2]) - -} - -func TestWhereMSI(t *testing.T) { - - v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - - selected := v.WhereMSI(func(i int, val map[string]interface{}) bool { - return i%2 == 0 - }).MustMSISlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupMSI(t *testing.T) { - - v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - - grouped := v.GroupMSI(func(i int, val map[string]interface{}) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]map[string]interface{}) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceMSI(t *testing.T) { - - v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - - rawArr := v.MustMSISlice() - - replaced := v.ReplaceMSI(func(index int, val map[string]interface{}) map[string]interface{} { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustMSISlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectMSI(t *testing.T) { - - v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}} - - collected := v.CollectMSI(func(index int, val map[string]interface{}) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestObjxMap(t *testing.T) { - - val := (Map)(New(1)) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").ObjxMap()) - assert.Equal(t, val, New(m).Get("value").MustObjxMap()) - assert.Equal(t, (Map)(New(nil)), New(m).Get("nothing").ObjxMap()) - assert.Equal(t, val, New(m).Get("nothing").ObjxMap(New(1))) - - assert.Panics(t, func() { - New(m).Get("age").MustObjxMap() - }) - -} - -func TestObjxMapSlice(t *testing.T) { - - val := (Map)(New(1)) - m := map[string]interface{}{"value": [](Map){val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").ObjxMapSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustObjxMapSlice()[0]) - assert.Equal(t, [](Map)(nil), New(m).Get("nothing").ObjxMapSlice()) - assert.Equal(t, val, New(m).Get("nothing").ObjxMapSlice([](Map){(Map)(New(1))})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustObjxMapSlice() - }) - -} - -func TestIsObjxMap(t *testing.T) { - - var v *Value - - v = &Value{data: (Map)(New(1))} - assert.True(t, v.IsObjxMap()) - - v = &Value{data: [](Map){(Map)(New(1))}} - assert.True(t, v.IsObjxMapSlice()) - -} - -func TestEachObjxMap(t *testing.T) { - - v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} - count := 0 - replacedVals := make([](Map), 0) - assert.Equal(t, v, v.EachObjxMap(func(i int, val Map) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustObjxMapSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustObjxMapSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustObjxMapSlice()[2]) - -} - -func TestWhereObjxMap(t *testing.T) { - - v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} - - selected := v.WhereObjxMap(func(i int, val Map) bool { - return i%2 == 0 - }).MustObjxMapSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupObjxMap(t *testing.T) { - - v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} - - grouped := v.GroupObjxMap(func(i int, val Map) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][](Map)) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceObjxMap(t *testing.T) { - - v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} - - rawArr := v.MustObjxMapSlice() - - replaced := v.ReplaceObjxMap(func(index int, val Map) Map { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustObjxMapSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectObjxMap(t *testing.T) { - - v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}} - - collected := v.CollectObjxMap(func(index int, val Map) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestBool(t *testing.T) { - - val := bool(true) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Bool()) - assert.Equal(t, val, New(m).Get("value").MustBool()) - assert.Equal(t, bool(false), New(m).Get("nothing").Bool()) - assert.Equal(t, val, New(m).Get("nothing").Bool(true)) - - assert.Panics(t, func() { - New(m).Get("age").MustBool() - }) - -} - -func TestBoolSlice(t *testing.T) { - - val := bool(true) - m := map[string]interface{}{"value": []bool{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").BoolSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustBoolSlice()[0]) - assert.Equal(t, []bool(nil), New(m).Get("nothing").BoolSlice()) - assert.Equal(t, val, New(m).Get("nothing").BoolSlice([]bool{bool(true)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustBoolSlice() - }) - -} - -func TestIsBool(t *testing.T) { - - var v *Value - - v = &Value{data: bool(true)} - assert.True(t, v.IsBool()) - - v = &Value{data: []bool{bool(true)}} - assert.True(t, v.IsBoolSlice()) - -} - -func TestEachBool(t *testing.T) { - - v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true)}} - count := 0 - replacedVals := make([]bool, 0) - assert.Equal(t, v, v.EachBool(func(i int, val bool) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustBoolSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustBoolSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustBoolSlice()[2]) - -} - -func TestWhereBool(t *testing.T) { - - v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} - - selected := v.WhereBool(func(i int, val bool) bool { - return i%2 == 0 - }).MustBoolSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupBool(t *testing.T) { - - v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} - - grouped := v.GroupBool(func(i int, val bool) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]bool) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceBool(t *testing.T) { - - v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} - - rawArr := v.MustBoolSlice() - - replaced := v.ReplaceBool(func(index int, val bool) bool { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustBoolSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectBool(t *testing.T) { - - v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}} - - collected := v.CollectBool(func(index int, val bool) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestStr(t *testing.T) { - - val := string("hello") - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Str()) - assert.Equal(t, val, New(m).Get("value").MustStr()) - assert.Equal(t, string(""), New(m).Get("nothing").Str()) - assert.Equal(t, val, New(m).Get("nothing").Str("hello")) - - assert.Panics(t, func() { - New(m).Get("age").MustStr() - }) - -} - -func TestStrSlice(t *testing.T) { - - val := string("hello") - m := map[string]interface{}{"value": []string{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").StrSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustStrSlice()[0]) - assert.Equal(t, []string(nil), New(m).Get("nothing").StrSlice()) - assert.Equal(t, val, New(m).Get("nothing").StrSlice([]string{string("hello")})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustStrSlice() - }) - -} - -func TestIsStr(t *testing.T) { - - var v *Value - - v = &Value{data: string("hello")} - assert.True(t, v.IsStr()) - - v = &Value{data: []string{string("hello")}} - assert.True(t, v.IsStrSlice()) - -} - -func TestEachStr(t *testing.T) { - - v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} - count := 0 - replacedVals := make([]string, 0) - assert.Equal(t, v, v.EachStr(func(i int, val string) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustStrSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustStrSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustStrSlice()[2]) - -} - -func TestWhereStr(t *testing.T) { - - v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} - - selected := v.WhereStr(func(i int, val string) bool { - return i%2 == 0 - }).MustStrSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupStr(t *testing.T) { - - v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} - - grouped := v.GroupStr(func(i int, val string) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]string) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceStr(t *testing.T) { - - v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} - - rawArr := v.MustStrSlice() - - replaced := v.ReplaceStr(func(index int, val string) string { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustStrSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectStr(t *testing.T) { - - v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}} - - collected := v.CollectStr(func(index int, val string) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInt(t *testing.T) { - - val := int(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int()) - assert.Equal(t, val, New(m).Get("value").MustInt()) - assert.Equal(t, int(0), New(m).Get("nothing").Int()) - assert.Equal(t, val, New(m).Get("nothing").Int(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustInt() - }) - -} - -func TestIntSlice(t *testing.T) { - - val := int(1) - m := map[string]interface{}{"value": []int{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").IntSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustIntSlice()[0]) - assert.Equal(t, []int(nil), New(m).Get("nothing").IntSlice()) - assert.Equal(t, val, New(m).Get("nothing").IntSlice([]int{int(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustIntSlice() - }) - -} - -func TestIsInt(t *testing.T) { - - var v *Value - - v = &Value{data: int(1)} - assert.True(t, v.IsInt()) - - v = &Value{data: []int{int(1)}} - assert.True(t, v.IsIntSlice()) - -} - -func TestEachInt(t *testing.T) { - - v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1)}} - count := 0 - replacedVals := make([]int, 0) - assert.Equal(t, v, v.EachInt(func(i int, val int) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustIntSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustIntSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustIntSlice()[2]) - -} - -func TestWhereInt(t *testing.T) { - - v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} - - selected := v.WhereInt(func(i int, val int) bool { - return i%2 == 0 - }).MustIntSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInt(t *testing.T) { - - v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} - - grouped := v.GroupInt(func(i int, val int) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]int) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInt(t *testing.T) { - - v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} - - rawArr := v.MustIntSlice() - - replaced := v.ReplaceInt(func(index int, val int) int { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustIntSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInt(t *testing.T) { - - v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}} - - collected := v.CollectInt(func(index int, val int) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInt8(t *testing.T) { - - val := int8(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int8()) - assert.Equal(t, val, New(m).Get("value").MustInt8()) - assert.Equal(t, int8(0), New(m).Get("nothing").Int8()) - assert.Equal(t, val, New(m).Get("nothing").Int8(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustInt8() - }) - -} - -func TestInt8Slice(t *testing.T) { - - val := int8(1) - m := map[string]interface{}{"value": []int8{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int8Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustInt8Slice()[0]) - assert.Equal(t, []int8(nil), New(m).Get("nothing").Int8Slice()) - assert.Equal(t, val, New(m).Get("nothing").Int8Slice([]int8{int8(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustInt8Slice() - }) - -} - -func TestIsInt8(t *testing.T) { - - var v *Value - - v = &Value{data: int8(1)} - assert.True(t, v.IsInt8()) - - v = &Value{data: []int8{int8(1)}} - assert.True(t, v.IsInt8Slice()) - -} - -func TestEachInt8(t *testing.T) { - - v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1)}} - count := 0 - replacedVals := make([]int8, 0) - assert.Equal(t, v, v.EachInt8(func(i int, val int8) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustInt8Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustInt8Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustInt8Slice()[2]) - -} - -func TestWhereInt8(t *testing.T) { - - v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} - - selected := v.WhereInt8(func(i int, val int8) bool { - return i%2 == 0 - }).MustInt8Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInt8(t *testing.T) { - - v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} - - grouped := v.GroupInt8(func(i int, val int8) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]int8) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInt8(t *testing.T) { - - v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} - - rawArr := v.MustInt8Slice() - - replaced := v.ReplaceInt8(func(index int, val int8) int8 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustInt8Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInt8(t *testing.T) { - - v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}} - - collected := v.CollectInt8(func(index int, val int8) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInt16(t *testing.T) { - - val := int16(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int16()) - assert.Equal(t, val, New(m).Get("value").MustInt16()) - assert.Equal(t, int16(0), New(m).Get("nothing").Int16()) - assert.Equal(t, val, New(m).Get("nothing").Int16(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustInt16() - }) - -} - -func TestInt16Slice(t *testing.T) { - - val := int16(1) - m := map[string]interface{}{"value": []int16{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int16Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustInt16Slice()[0]) - assert.Equal(t, []int16(nil), New(m).Get("nothing").Int16Slice()) - assert.Equal(t, val, New(m).Get("nothing").Int16Slice([]int16{int16(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustInt16Slice() - }) - -} - -func TestIsInt16(t *testing.T) { - - var v *Value - - v = &Value{data: int16(1)} - assert.True(t, v.IsInt16()) - - v = &Value{data: []int16{int16(1)}} - assert.True(t, v.IsInt16Slice()) - -} - -func TestEachInt16(t *testing.T) { - - v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1)}} - count := 0 - replacedVals := make([]int16, 0) - assert.Equal(t, v, v.EachInt16(func(i int, val int16) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustInt16Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustInt16Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustInt16Slice()[2]) - -} - -func TestWhereInt16(t *testing.T) { - - v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} - - selected := v.WhereInt16(func(i int, val int16) bool { - return i%2 == 0 - }).MustInt16Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInt16(t *testing.T) { - - v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} - - grouped := v.GroupInt16(func(i int, val int16) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]int16) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInt16(t *testing.T) { - - v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} - - rawArr := v.MustInt16Slice() - - replaced := v.ReplaceInt16(func(index int, val int16) int16 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustInt16Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInt16(t *testing.T) { - - v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}} - - collected := v.CollectInt16(func(index int, val int16) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInt32(t *testing.T) { - - val := int32(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int32()) - assert.Equal(t, val, New(m).Get("value").MustInt32()) - assert.Equal(t, int32(0), New(m).Get("nothing").Int32()) - assert.Equal(t, val, New(m).Get("nothing").Int32(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustInt32() - }) - -} - -func TestInt32Slice(t *testing.T) { - - val := int32(1) - m := map[string]interface{}{"value": []int32{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int32Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustInt32Slice()[0]) - assert.Equal(t, []int32(nil), New(m).Get("nothing").Int32Slice()) - assert.Equal(t, val, New(m).Get("nothing").Int32Slice([]int32{int32(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustInt32Slice() - }) - -} - -func TestIsInt32(t *testing.T) { - - var v *Value - - v = &Value{data: int32(1)} - assert.True(t, v.IsInt32()) - - v = &Value{data: []int32{int32(1)}} - assert.True(t, v.IsInt32Slice()) - -} - -func TestEachInt32(t *testing.T) { - - v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1)}} - count := 0 - replacedVals := make([]int32, 0) - assert.Equal(t, v, v.EachInt32(func(i int, val int32) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustInt32Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustInt32Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustInt32Slice()[2]) - -} - -func TestWhereInt32(t *testing.T) { - - v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} - - selected := v.WhereInt32(func(i int, val int32) bool { - return i%2 == 0 - }).MustInt32Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInt32(t *testing.T) { - - v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} - - grouped := v.GroupInt32(func(i int, val int32) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]int32) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInt32(t *testing.T) { - - v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} - - rawArr := v.MustInt32Slice() - - replaced := v.ReplaceInt32(func(index int, val int32) int32 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustInt32Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInt32(t *testing.T) { - - v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}} - - collected := v.CollectInt32(func(index int, val int32) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestInt64(t *testing.T) { - - val := int64(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int64()) - assert.Equal(t, val, New(m).Get("value").MustInt64()) - assert.Equal(t, int64(0), New(m).Get("nothing").Int64()) - assert.Equal(t, val, New(m).Get("nothing").Int64(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustInt64() - }) - -} - -func TestInt64Slice(t *testing.T) { - - val := int64(1) - m := map[string]interface{}{"value": []int64{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Int64Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustInt64Slice()[0]) - assert.Equal(t, []int64(nil), New(m).Get("nothing").Int64Slice()) - assert.Equal(t, val, New(m).Get("nothing").Int64Slice([]int64{int64(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustInt64Slice() - }) - -} - -func TestIsInt64(t *testing.T) { - - var v *Value - - v = &Value{data: int64(1)} - assert.True(t, v.IsInt64()) - - v = &Value{data: []int64{int64(1)}} - assert.True(t, v.IsInt64Slice()) - -} - -func TestEachInt64(t *testing.T) { - - v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1)}} - count := 0 - replacedVals := make([]int64, 0) - assert.Equal(t, v, v.EachInt64(func(i int, val int64) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustInt64Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustInt64Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustInt64Slice()[2]) - -} - -func TestWhereInt64(t *testing.T) { - - v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} - - selected := v.WhereInt64(func(i int, val int64) bool { - return i%2 == 0 - }).MustInt64Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupInt64(t *testing.T) { - - v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} - - grouped := v.GroupInt64(func(i int, val int64) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]int64) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceInt64(t *testing.T) { - - v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} - - rawArr := v.MustInt64Slice() - - replaced := v.ReplaceInt64(func(index int, val int64) int64 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustInt64Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectInt64(t *testing.T) { - - v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}} - - collected := v.CollectInt64(func(index int, val int64) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUint(t *testing.T) { - - val := uint(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint()) - assert.Equal(t, val, New(m).Get("value").MustUint()) - assert.Equal(t, uint(0), New(m).Get("nothing").Uint()) - assert.Equal(t, val, New(m).Get("nothing").Uint(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUint() - }) - -} - -func TestUintSlice(t *testing.T) { - - val := uint(1) - m := map[string]interface{}{"value": []uint{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").UintSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUintSlice()[0]) - assert.Equal(t, []uint(nil), New(m).Get("nothing").UintSlice()) - assert.Equal(t, val, New(m).Get("nothing").UintSlice([]uint{uint(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUintSlice() - }) - -} - -func TestIsUint(t *testing.T) { - - var v *Value - - v = &Value{data: uint(1)} - assert.True(t, v.IsUint()) - - v = &Value{data: []uint{uint(1)}} - assert.True(t, v.IsUintSlice()) - -} - -func TestEachUint(t *testing.T) { - - v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1)}} - count := 0 - replacedVals := make([]uint, 0) - assert.Equal(t, v, v.EachUint(func(i int, val uint) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUintSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustUintSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustUintSlice()[2]) - -} - -func TestWhereUint(t *testing.T) { - - v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} - - selected := v.WhereUint(func(i int, val uint) bool { - return i%2 == 0 - }).MustUintSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUint(t *testing.T) { - - v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} - - grouped := v.GroupUint(func(i int, val uint) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uint) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUint(t *testing.T) { - - v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} - - rawArr := v.MustUintSlice() - - replaced := v.ReplaceUint(func(index int, val uint) uint { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUintSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUint(t *testing.T) { - - v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}} - - collected := v.CollectUint(func(index int, val uint) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUint8(t *testing.T) { - - val := uint8(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint8()) - assert.Equal(t, val, New(m).Get("value").MustUint8()) - assert.Equal(t, uint8(0), New(m).Get("nothing").Uint8()) - assert.Equal(t, val, New(m).Get("nothing").Uint8(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUint8() - }) - -} - -func TestUint8Slice(t *testing.T) { - - val := uint8(1) - m := map[string]interface{}{"value": []uint8{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint8Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUint8Slice()[0]) - assert.Equal(t, []uint8(nil), New(m).Get("nothing").Uint8Slice()) - assert.Equal(t, val, New(m).Get("nothing").Uint8Slice([]uint8{uint8(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUint8Slice() - }) - -} - -func TestIsUint8(t *testing.T) { - - var v *Value - - v = &Value{data: uint8(1)} - assert.True(t, v.IsUint8()) - - v = &Value{data: []uint8{uint8(1)}} - assert.True(t, v.IsUint8Slice()) - -} - -func TestEachUint8(t *testing.T) { - - v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} - count := 0 - replacedVals := make([]uint8, 0) - assert.Equal(t, v, v.EachUint8(func(i int, val uint8) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUint8Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustUint8Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustUint8Slice()[2]) - -} - -func TestWhereUint8(t *testing.T) { - - v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} - - selected := v.WhereUint8(func(i int, val uint8) bool { - return i%2 == 0 - }).MustUint8Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUint8(t *testing.T) { - - v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} - - grouped := v.GroupUint8(func(i int, val uint8) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uint8) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUint8(t *testing.T) { - - v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} - - rawArr := v.MustUint8Slice() - - replaced := v.ReplaceUint8(func(index int, val uint8) uint8 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUint8Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUint8(t *testing.T) { - - v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}} - - collected := v.CollectUint8(func(index int, val uint8) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUint16(t *testing.T) { - - val := uint16(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint16()) - assert.Equal(t, val, New(m).Get("value").MustUint16()) - assert.Equal(t, uint16(0), New(m).Get("nothing").Uint16()) - assert.Equal(t, val, New(m).Get("nothing").Uint16(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUint16() - }) - -} - -func TestUint16Slice(t *testing.T) { - - val := uint16(1) - m := map[string]interface{}{"value": []uint16{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint16Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUint16Slice()[0]) - assert.Equal(t, []uint16(nil), New(m).Get("nothing").Uint16Slice()) - assert.Equal(t, val, New(m).Get("nothing").Uint16Slice([]uint16{uint16(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUint16Slice() - }) - -} - -func TestIsUint16(t *testing.T) { - - var v *Value - - v = &Value{data: uint16(1)} - assert.True(t, v.IsUint16()) - - v = &Value{data: []uint16{uint16(1)}} - assert.True(t, v.IsUint16Slice()) - -} - -func TestEachUint16(t *testing.T) { - - v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} - count := 0 - replacedVals := make([]uint16, 0) - assert.Equal(t, v, v.EachUint16(func(i int, val uint16) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUint16Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustUint16Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustUint16Slice()[2]) - -} - -func TestWhereUint16(t *testing.T) { - - v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} - - selected := v.WhereUint16(func(i int, val uint16) bool { - return i%2 == 0 - }).MustUint16Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUint16(t *testing.T) { - - v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} - - grouped := v.GroupUint16(func(i int, val uint16) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uint16) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUint16(t *testing.T) { - - v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} - - rawArr := v.MustUint16Slice() - - replaced := v.ReplaceUint16(func(index int, val uint16) uint16 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUint16Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUint16(t *testing.T) { - - v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}} - - collected := v.CollectUint16(func(index int, val uint16) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUint32(t *testing.T) { - - val := uint32(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint32()) - assert.Equal(t, val, New(m).Get("value").MustUint32()) - assert.Equal(t, uint32(0), New(m).Get("nothing").Uint32()) - assert.Equal(t, val, New(m).Get("nothing").Uint32(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUint32() - }) - -} - -func TestUint32Slice(t *testing.T) { - - val := uint32(1) - m := map[string]interface{}{"value": []uint32{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint32Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUint32Slice()[0]) - assert.Equal(t, []uint32(nil), New(m).Get("nothing").Uint32Slice()) - assert.Equal(t, val, New(m).Get("nothing").Uint32Slice([]uint32{uint32(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUint32Slice() - }) - -} - -func TestIsUint32(t *testing.T) { - - var v *Value - - v = &Value{data: uint32(1)} - assert.True(t, v.IsUint32()) - - v = &Value{data: []uint32{uint32(1)}} - assert.True(t, v.IsUint32Slice()) - -} - -func TestEachUint32(t *testing.T) { - - v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} - count := 0 - replacedVals := make([]uint32, 0) - assert.Equal(t, v, v.EachUint32(func(i int, val uint32) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUint32Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustUint32Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustUint32Slice()[2]) - -} - -func TestWhereUint32(t *testing.T) { - - v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} - - selected := v.WhereUint32(func(i int, val uint32) bool { - return i%2 == 0 - }).MustUint32Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUint32(t *testing.T) { - - v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} - - grouped := v.GroupUint32(func(i int, val uint32) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uint32) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUint32(t *testing.T) { - - v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} - - rawArr := v.MustUint32Slice() - - replaced := v.ReplaceUint32(func(index int, val uint32) uint32 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUint32Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUint32(t *testing.T) { - - v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}} - - collected := v.CollectUint32(func(index int, val uint32) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUint64(t *testing.T) { - - val := uint64(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint64()) - assert.Equal(t, val, New(m).Get("value").MustUint64()) - assert.Equal(t, uint64(0), New(m).Get("nothing").Uint64()) - assert.Equal(t, val, New(m).Get("nothing").Uint64(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUint64() - }) - -} - -func TestUint64Slice(t *testing.T) { - - val := uint64(1) - m := map[string]interface{}{"value": []uint64{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uint64Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUint64Slice()[0]) - assert.Equal(t, []uint64(nil), New(m).Get("nothing").Uint64Slice()) - assert.Equal(t, val, New(m).Get("nothing").Uint64Slice([]uint64{uint64(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUint64Slice() - }) - -} - -func TestIsUint64(t *testing.T) { - - var v *Value - - v = &Value{data: uint64(1)} - assert.True(t, v.IsUint64()) - - v = &Value{data: []uint64{uint64(1)}} - assert.True(t, v.IsUint64Slice()) - -} - -func TestEachUint64(t *testing.T) { - - v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} - count := 0 - replacedVals := make([]uint64, 0) - assert.Equal(t, v, v.EachUint64(func(i int, val uint64) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUint64Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustUint64Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustUint64Slice()[2]) - -} - -func TestWhereUint64(t *testing.T) { - - v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} - - selected := v.WhereUint64(func(i int, val uint64) bool { - return i%2 == 0 - }).MustUint64Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUint64(t *testing.T) { - - v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} - - grouped := v.GroupUint64(func(i int, val uint64) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uint64) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUint64(t *testing.T) { - - v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} - - rawArr := v.MustUint64Slice() - - replaced := v.ReplaceUint64(func(index int, val uint64) uint64 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUint64Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUint64(t *testing.T) { - - v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}} - - collected := v.CollectUint64(func(index int, val uint64) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestUintptr(t *testing.T) { - - val := uintptr(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Uintptr()) - assert.Equal(t, val, New(m).Get("value").MustUintptr()) - assert.Equal(t, uintptr(0), New(m).Get("nothing").Uintptr()) - assert.Equal(t, val, New(m).Get("nothing").Uintptr(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustUintptr() - }) - -} - -func TestUintptrSlice(t *testing.T) { - - val := uintptr(1) - m := map[string]interface{}{"value": []uintptr{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").UintptrSlice()[0]) - assert.Equal(t, val, New(m).Get("value").MustUintptrSlice()[0]) - assert.Equal(t, []uintptr(nil), New(m).Get("nothing").UintptrSlice()) - assert.Equal(t, val, New(m).Get("nothing").UintptrSlice([]uintptr{uintptr(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustUintptrSlice() - }) - -} - -func TestIsUintptr(t *testing.T) { - - var v *Value - - v = &Value{data: uintptr(1)} - assert.True(t, v.IsUintptr()) - - v = &Value{data: []uintptr{uintptr(1)}} - assert.True(t, v.IsUintptrSlice()) - -} - -func TestEachUintptr(t *testing.T) { - - v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} - count := 0 - replacedVals := make([]uintptr, 0) - assert.Equal(t, v, v.EachUintptr(func(i int, val uintptr) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustUintptrSlice()[0]) - assert.Equal(t, replacedVals[1], v.MustUintptrSlice()[1]) - assert.Equal(t, replacedVals[2], v.MustUintptrSlice()[2]) - -} - -func TestWhereUintptr(t *testing.T) { - - v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} - - selected := v.WhereUintptr(func(i int, val uintptr) bool { - return i%2 == 0 - }).MustUintptrSlice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupUintptr(t *testing.T) { - - v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} - - grouped := v.GroupUintptr(func(i int, val uintptr) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]uintptr) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceUintptr(t *testing.T) { - - v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} - - rawArr := v.MustUintptrSlice() - - replaced := v.ReplaceUintptr(func(index int, val uintptr) uintptr { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustUintptrSlice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectUintptr(t *testing.T) { - - v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}} - - collected := v.CollectUintptr(func(index int, val uintptr) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestFloat32(t *testing.T) { - - val := float32(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Float32()) - assert.Equal(t, val, New(m).Get("value").MustFloat32()) - assert.Equal(t, float32(0), New(m).Get("nothing").Float32()) - assert.Equal(t, val, New(m).Get("nothing").Float32(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustFloat32() - }) - -} - -func TestFloat32Slice(t *testing.T) { - - val := float32(1) - m := map[string]interface{}{"value": []float32{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Float32Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustFloat32Slice()[0]) - assert.Equal(t, []float32(nil), New(m).Get("nothing").Float32Slice()) - assert.Equal(t, val, New(m).Get("nothing").Float32Slice([]float32{float32(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustFloat32Slice() - }) - -} - -func TestIsFloat32(t *testing.T) { - - var v *Value - - v = &Value{data: float32(1)} - assert.True(t, v.IsFloat32()) - - v = &Value{data: []float32{float32(1)}} - assert.True(t, v.IsFloat32Slice()) - -} - -func TestEachFloat32(t *testing.T) { - - v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1)}} - count := 0 - replacedVals := make([]float32, 0) - assert.Equal(t, v, v.EachFloat32(func(i int, val float32) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustFloat32Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustFloat32Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustFloat32Slice()[2]) - -} - -func TestWhereFloat32(t *testing.T) { - - v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} - - selected := v.WhereFloat32(func(i int, val float32) bool { - return i%2 == 0 - }).MustFloat32Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupFloat32(t *testing.T) { - - v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} - - grouped := v.GroupFloat32(func(i int, val float32) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]float32) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceFloat32(t *testing.T) { - - v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} - - rawArr := v.MustFloat32Slice() - - replaced := v.ReplaceFloat32(func(index int, val float32) float32 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustFloat32Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectFloat32(t *testing.T) { - - v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}} - - collected := v.CollectFloat32(func(index int, val float32) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestFloat64(t *testing.T) { - - val := float64(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Float64()) - assert.Equal(t, val, New(m).Get("value").MustFloat64()) - assert.Equal(t, float64(0), New(m).Get("nothing").Float64()) - assert.Equal(t, val, New(m).Get("nothing").Float64(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustFloat64() - }) - -} - -func TestFloat64Slice(t *testing.T) { - - val := float64(1) - m := map[string]interface{}{"value": []float64{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Float64Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustFloat64Slice()[0]) - assert.Equal(t, []float64(nil), New(m).Get("nothing").Float64Slice()) - assert.Equal(t, val, New(m).Get("nothing").Float64Slice([]float64{float64(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustFloat64Slice() - }) - -} - -func TestIsFloat64(t *testing.T) { - - var v *Value - - v = &Value{data: float64(1)} - assert.True(t, v.IsFloat64()) - - v = &Value{data: []float64{float64(1)}} - assert.True(t, v.IsFloat64Slice()) - -} - -func TestEachFloat64(t *testing.T) { - - v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1)}} - count := 0 - replacedVals := make([]float64, 0) - assert.Equal(t, v, v.EachFloat64(func(i int, val float64) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustFloat64Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustFloat64Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustFloat64Slice()[2]) - -} - -func TestWhereFloat64(t *testing.T) { - - v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} - - selected := v.WhereFloat64(func(i int, val float64) bool { - return i%2 == 0 - }).MustFloat64Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupFloat64(t *testing.T) { - - v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} - - grouped := v.GroupFloat64(func(i int, val float64) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]float64) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceFloat64(t *testing.T) { - - v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} - - rawArr := v.MustFloat64Slice() - - replaced := v.ReplaceFloat64(func(index int, val float64) float64 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustFloat64Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectFloat64(t *testing.T) { - - v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}} - - collected := v.CollectFloat64(func(index int, val float64) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestComplex64(t *testing.T) { - - val := complex64(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Complex64()) - assert.Equal(t, val, New(m).Get("value").MustComplex64()) - assert.Equal(t, complex64(0), New(m).Get("nothing").Complex64()) - assert.Equal(t, val, New(m).Get("nothing").Complex64(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustComplex64() - }) - -} - -func TestComplex64Slice(t *testing.T) { - - val := complex64(1) - m := map[string]interface{}{"value": []complex64{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Complex64Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustComplex64Slice()[0]) - assert.Equal(t, []complex64(nil), New(m).Get("nothing").Complex64Slice()) - assert.Equal(t, val, New(m).Get("nothing").Complex64Slice([]complex64{complex64(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustComplex64Slice() - }) - -} - -func TestIsComplex64(t *testing.T) { - - var v *Value - - v = &Value{data: complex64(1)} - assert.True(t, v.IsComplex64()) - - v = &Value{data: []complex64{complex64(1)}} - assert.True(t, v.IsComplex64Slice()) - -} - -func TestEachComplex64(t *testing.T) { - - v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} - count := 0 - replacedVals := make([]complex64, 0) - assert.Equal(t, v, v.EachComplex64(func(i int, val complex64) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustComplex64Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustComplex64Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustComplex64Slice()[2]) - -} - -func TestWhereComplex64(t *testing.T) { - - v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} - - selected := v.WhereComplex64(func(i int, val complex64) bool { - return i%2 == 0 - }).MustComplex64Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupComplex64(t *testing.T) { - - v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} - - grouped := v.GroupComplex64(func(i int, val complex64) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]complex64) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceComplex64(t *testing.T) { - - v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} - - rawArr := v.MustComplex64Slice() - - replaced := v.ReplaceComplex64(func(index int, val complex64) complex64 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustComplex64Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectComplex64(t *testing.T) { - - v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}} - - collected := v.CollectComplex64(func(index int, val complex64) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} - -// ************************************************************ -// TESTS -// ************************************************************ - -func TestComplex128(t *testing.T) { - - val := complex128(1) - m := map[string]interface{}{"value": val, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Complex128()) - assert.Equal(t, val, New(m).Get("value").MustComplex128()) - assert.Equal(t, complex128(0), New(m).Get("nothing").Complex128()) - assert.Equal(t, val, New(m).Get("nothing").Complex128(1)) - - assert.Panics(t, func() { - New(m).Get("age").MustComplex128() - }) - -} - -func TestComplex128Slice(t *testing.T) { - - val := complex128(1) - m := map[string]interface{}{"value": []complex128{val}, "nothing": nil} - assert.Equal(t, val, New(m).Get("value").Complex128Slice()[0]) - assert.Equal(t, val, New(m).Get("value").MustComplex128Slice()[0]) - assert.Equal(t, []complex128(nil), New(m).Get("nothing").Complex128Slice()) - assert.Equal(t, val, New(m).Get("nothing").Complex128Slice([]complex128{complex128(1)})[0]) - - assert.Panics(t, func() { - New(m).Get("nothing").MustComplex128Slice() - }) - -} - -func TestIsComplex128(t *testing.T) { - - var v *Value - - v = &Value{data: complex128(1)} - assert.True(t, v.IsComplex128()) - - v = &Value{data: []complex128{complex128(1)}} - assert.True(t, v.IsComplex128Slice()) - -} - -func TestEachComplex128(t *testing.T) { - - v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} - count := 0 - replacedVals := make([]complex128, 0) - assert.Equal(t, v, v.EachComplex128(func(i int, val complex128) bool { - - count++ - replacedVals = append(replacedVals, val) - - // abort early - if i == 2 { - return false - } - - return true - - })) - - assert.Equal(t, count, 3) - assert.Equal(t, replacedVals[0], v.MustComplex128Slice()[0]) - assert.Equal(t, replacedVals[1], v.MustComplex128Slice()[1]) - assert.Equal(t, replacedVals[2], v.MustComplex128Slice()[2]) - -} - -func TestWhereComplex128(t *testing.T) { - - v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} - - selected := v.WhereComplex128(func(i int, val complex128) bool { - return i%2 == 0 - }).MustComplex128Slice() - - assert.Equal(t, 3, len(selected)) - -} - -func TestGroupComplex128(t *testing.T) { - - v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} - - grouped := v.GroupComplex128(func(i int, val complex128) string { - return fmt.Sprintf("%v", i%2 == 0) - }).data.(map[string][]complex128) - - assert.Equal(t, 2, len(grouped)) - assert.Equal(t, 3, len(grouped["true"])) - assert.Equal(t, 3, len(grouped["false"])) - -} - -func TestReplaceComplex128(t *testing.T) { - - v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} - - rawArr := v.MustComplex128Slice() - - replaced := v.ReplaceComplex128(func(index int, val complex128) complex128 { - if index < len(rawArr)-1 { - return rawArr[index+1] - } - return rawArr[0] - }) - - replacedArr := replaced.MustComplex128Slice() - if assert.Equal(t, 6, len(replacedArr)) { - assert.Equal(t, replacedArr[0], rawArr[1]) - assert.Equal(t, replacedArr[1], rawArr[2]) - assert.Equal(t, replacedArr[2], rawArr[3]) - assert.Equal(t, replacedArr[3], rawArr[4]) - assert.Equal(t, replacedArr[4], rawArr[5]) - assert.Equal(t, replacedArr[5], rawArr[0]) - } - -} - -func TestCollectComplex128(t *testing.T) { - - v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}} - - collected := v.CollectComplex128(func(index int, val complex128) interface{} { - return index - }) - - collectedArr := collected.MustInterSlice() - if assert.Equal(t, 6, len(collectedArr)) { - assert.Equal(t, collectedArr[0], 0) - assert.Equal(t, collectedArr[1], 1) - assert.Equal(t, collectedArr[2], 2) - assert.Equal(t, collectedArr[3], 3) - assert.Equal(t, collectedArr[4], 4) - assert.Equal(t, collectedArr[5], 5) - } - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value.go deleted file mode 100644 index 7aaef06b1..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value.go +++ /dev/null @@ -1,13 +0,0 @@ -package objx - -// Value provides methods for extracting interface{} data in various -// types. -type Value struct { - // data contains the raw data being managed by this Value - data interface{} -} - -// Data returns the raw data contained by this Value -func (v *Value) Data() interface{} { - return v.data -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value_test.go deleted file mode 100644 index 0bc65d92c..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/objx/value_test.go +++ /dev/null @@ -1 +0,0 @@ -package objx diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions.go deleted file mode 100644 index 58e178165..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions.go +++ /dev/null @@ -1,805 +0,0 @@ -package assert - -import ( - "bufio" - "bytes" - "fmt" - "reflect" - "regexp" - "runtime" - "strings" - "time" -) - -// TestingT is an interface wrapper around *testing.T -type TestingT interface { - Errorf(format string, args ...interface{}) -} - -// Comparison a custom function that returns true on success and false on failure -type Comparison func() (success bool) - -/* - Helper functions -*/ - -// ObjectsAreEqual determines if two objects are considered equal. -// -// This function does no assertion of any kind. -func ObjectsAreEqual(expected, actual interface{}) bool { - - if expected == nil || actual == nil { - return expected == actual - } - - if reflect.DeepEqual(expected, actual) { - return true - } - - // Last ditch effort - if fmt.Sprintf("%#v", expected) == fmt.Sprintf("%#v", actual) { - return true - } - - return false - -} - -func ObjectsAreEqualValues(expected, actual interface{}) bool { - if ObjectsAreEqual(expected, actual) { - return true - } - - actualType := reflect.TypeOf(actual) - expectedValue := reflect.ValueOf(expected) - if expectedValue.Type().ConvertibleTo(actualType) { - // Attempt comparison after type conversion - if reflect.DeepEqual(actual, expectedValue.Convert(actualType).Interface()) { - return true - } - } - - return false -} - -/* CallerInfo is necessary because the assert functions use the testing object -internally, causing it to print the file:line of the assert method, rather than where -the problem actually occured in calling code.*/ - -// CallerInfo returns a string containing the file and line number of the assert call -// that failed. -func CallerInfo() string { - - file := "" - line := 0 - ok := false - - for i := 0; ; i++ { - _, file, line, ok = runtime.Caller(i) - if !ok { - return "" - } - parts := strings.Split(file, "/") - dir := parts[len(parts)-2] - file = parts[len(parts)-1] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - break - } - } - - return fmt.Sprintf("%s:%d", file, line) -} - -// getWhitespaceString returns a string that is long enough to overwrite the default -// output from the go testing framework. -func getWhitespaceString() string { - - _, file, line, ok := runtime.Caller(1) - if !ok { - return "" - } - parts := strings.Split(file, "/") - file = parts[len(parts)-1] - - return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) - -} - -func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { - if len(msgAndArgs) == 0 || msgAndArgs == nil { - return "" - } - if len(msgAndArgs) == 1 { - return msgAndArgs[0].(string) - } - if len(msgAndArgs) > 1 { - return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) - } - return "" -} - -// Indents all lines of the message by appending a number of tabs to each line, in an output format compatible with Go's -// test printing (see inner comment for specifics) -func indentMessageLines(message string, tabs int) string { - outBuf := new(bytes.Buffer) - - for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { - if i != 0 { - outBuf.WriteRune('\n') - } - for ii := 0; ii < tabs; ii++ { - outBuf.WriteRune('\t') - // Bizarrely, all lines except the first need one fewer tabs prepended, so deliberately advance the counter - // by 1 prematurely. - if ii == 0 && i > 0 { - ii++ - } - } - outBuf.WriteString(scanner.Text()) - } - - return outBuf.String() -} - -// Fail reports a failure through -func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - - message := messageFromMsgAndArgs(msgAndArgs...) - - if len(message) > 0 { - t.Errorf("\r%s\r\tLocation:\t%s\n"+ - "\r\tError:%s\n"+ - "\r\tMessages:\t%s\n\r", - getWhitespaceString(), - CallerInfo(), - indentMessageLines(failureMessage, 2), - message) - } else { - t.Errorf("\r%s\r\tLocation:\t%s\n"+ - "\r\tError:%s\n\r", - getWhitespaceString(), - CallerInfo(), - indentMessageLines(failureMessage, 2)) - } - - return false -} - -// Implements asserts that an object is implemented by the specified interface. -// -// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject") -func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - - interfaceType := reflect.TypeOf(interfaceObject).Elem() - - if !reflect.TypeOf(object).Implements(interfaceType) { - return Fail(t, fmt.Sprintf("Object must implement %v", interfaceType), msgAndArgs...) - } - - return true - -} - -// IsType asserts that the specified objects are of the same type. -func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - - if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { - return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) - } - - return true -} - -// Equal asserts that two objects are equal. -// -// assert.Equal(t, 123, 123, "123 and 123 should be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - if !ObjectsAreEqual(expected, actual) { - return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+ - " != %#v (actual)", expected, actual), msgAndArgs...) - } - - return true - -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - if !ObjectsAreEqualValues(expected, actual) { - return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+ - " != %#v (actual)", expected, actual), msgAndArgs...) - } - - return true - -} - -// Exactly asserts that two objects are equal is value and type. -// -// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - aType := reflect.TypeOf(expected) - bType := reflect.TypeOf(actual) - - if aType != bType { - return Fail(t, "Types expected to match exactly", "%v != %v", aType, bType) - } - - return Equal(t, expected, actual, msgAndArgs...) - -} - -// NotNil asserts that the specified object is not nil. -// -// assert.NotNil(t, err, "err should be something") -// -// Returns whether the assertion was successful (true) or not (false). -func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - - success := true - - if object == nil { - success = false - } else { - value := reflect.ValueOf(object) - kind := value.Kind() - if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { - success = false - } - } - - if !success { - Fail(t, "Expected not to be nil.", msgAndArgs...) - } - - return success -} - -// isNil checks if a specified object is nil or not, without Failing. -func isNil(object interface{}) bool { - if object == nil { - return true - } - - value := reflect.ValueOf(object) - kind := value.Kind() - if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { - return true - } - - return false -} - -// Nil asserts that the specified object is nil. -// -// assert.Nil(t, err, "err should be nothing") -// -// Returns whether the assertion was successful (true) or not (false). -func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if isNil(object) { - return true - } - return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) -} - -var zeros = []interface{}{ - int(0), - int8(0), - int16(0), - int32(0), - int64(0), - uint(0), - uint8(0), - uint16(0), - uint32(0), - uint64(0), - float32(0), - float64(0), -} - -// isEmpty gets whether the specified object is considered empty or not. -func isEmpty(object interface{}) bool { - - if object == nil { - return true - } else if object == "" { - return true - } else if object == false { - return true - } - - for _, v := range zeros { - if object == v { - return true - } - } - - objValue := reflect.ValueOf(object) - - switch objValue.Kind() { - case reflect.Map: - fallthrough - case reflect.Slice, reflect.Chan: - { - return (objValue.Len() == 0) - } - case reflect.Ptr: - { - switch object.(type) { - case *time.Time: - return object.(*time.Time).IsZero() - default: - return false - } - } - } - return false -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Empty(t, obj) -// -// Returns whether the assertion was successful (true) or not (false). -func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - - pass := isEmpty(object) - if !pass { - Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) - } - - return pass - -} - -// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - - pass := !isEmpty(object) - if !pass { - Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) - } - - return pass - -} - -// getLen try to get length of object. -// return (false, 0) if impossible. -func getLen(x interface{}) (ok bool, length int) { - v := reflect.ValueOf(x) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - return true, v.Len() -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// assert.Len(t, mySlice, 3, "The size of slice is not 3") -// -// Returns whether the assertion was successful (true) or not (false). -func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { - ok, l := getLen(object) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) - } - - if l != length { - return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) - } - return true -} - -// True asserts that the specified value is true. -// -// assert.True(t, myBool, "myBool should be true") -// -// Returns whether the assertion was successful (true) or not (false). -func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - - if value != true { - return Fail(t, "Should be true", msgAndArgs...) - } - - return true - -} - -// False asserts that the specified value is true. -// -// assert.False(t, myBool, "myBool should be false") -// -// Returns whether the assertion was successful (true) or not (false). -func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - - if value != false { - return Fail(t, "Should be false", msgAndArgs...) - } - - return true - -} - -// NotEqual asserts that the specified values are NOT equal. -// -// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - if ObjectsAreEqual(expected, actual) { - return Fail(t, "Should not be equal", msgAndArgs...) - } - - return true - -} - -// containsElement try loop over the list check if the list includes the element. -// return (false, false) if impossible. -// return (true, false) if element was not found. -// return (true, true) if element was found. -func includeElement(list interface{}, element interface{}) (ok, found bool) { - - listValue := reflect.ValueOf(list) - elementValue := reflect.ValueOf(element) - defer func() { - if e := recover(); e != nil { - ok = false - found = false - } - }() - - if reflect.TypeOf(list).Kind() == reflect.String { - return true, strings.Contains(listValue.String(), elementValue.String()) - } - - for i := 0; i < listValue.Len(); i++ { - if ObjectsAreEqual(listValue.Index(i).Interface(), element) { - return true, true - } - } - return true, false - -} - -// Contains asserts that the specified string or list(array, slice...) contains the -// specified substring or element. -// -// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'") -// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") -// -// Returns whether the assertion was successful (true) or not (false). -func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - - ok, found := includeElement(s, contains) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) - } - if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) - } - - return true - -} - -// NotContains asserts that the specified string or list(array, slice...) does NOT contain the -// specified substring or element. -// -// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") -// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") -// -// Returns whether the assertion was successful (true) or not (false). -func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - - ok, found := includeElement(s, contains) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) - } - if found { - return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) - } - - return true - -} - -// Condition uses a Comparison to assert a complex condition. -func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { - result := comp() - if !result { - Fail(t, "Condition failed!", msgAndArgs...) - } - return result -} - -// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics -// methods, and represents a simple func that takes no arguments, and returns nothing. -type PanicTestFunc func() - -// didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}) { - - didPanic := false - var message interface{} - func() { - - defer func() { - if message = recover(); message != nil { - didPanic = true - } - }() - - // call the target function - f() - - }() - - return didPanic, message - -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panics(t, func(){ -// GoCrazy() -// }, "Calling GoCrazy() should panic") -// -// Returns whether the assertion was successful (true) or not (false). -func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - - return true -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanics(t, func(){ -// RemainCalm() -// }, "Calling RemainCalm() should NOT panic") -// -// Returns whether the assertion was successful (true) or not (false). -func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - if funcDidPanic, panicValue := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - - return true -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") -// -// Returns whether the assertion was successful (true) or not (false). -func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - - dt := expected.Sub(actual) - if dt < -delta || dt > delta { - return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) - } - - return true -} - -func toFloat(x interface{}) (float64, bool) { - var xf float64 - xok := true - - switch xn := x.(type) { - case uint8: - xf = float64(xn) - case uint16: - xf = float64(xn) - case uint32: - xf = float64(xn) - case uint64: - xf = float64(xn) - case int: - xf = float64(xn) - case int8: - xf = float64(xn) - case int16: - xf = float64(xn) - case int32: - xf = float64(xn) - case int64: - xf = float64(xn) - case float32: - xf = float64(xn) - case float64: - xf = float64(xn) - default: - xok = false - } - - return xf, xok -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) -// -// Returns whether the assertion was successful (true) or not (false). -func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - - af, aok := toFloat(expected) - bf, bok := toFloat(actual) - - if !aok || !bok { - return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) - } - - dt := af - bf - if dt < -delta || dt > delta { - return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) - } - - return true -} - -// min(|expected|, |actual|) * epsilon -func calcEpsilonDelta(expected, actual interface{}, epsilon float64) float64 { - af, aok := toFloat(expected) - bf, bok := toFloat(actual) - - if !aok || !bok { - // invalid input - return 0 - } - - if af < 0 { - af = -af - } - if bf < 0 { - bf = -bf - } - var delta float64 - if af < bf { - delta = af * epsilon - } else { - delta = bf * epsilon - } - return delta -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -// -// Returns whether the assertion was successful (true) or not (false). -func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - delta := calcEpsilonDelta(expected, actual, epsilon) - - return InDelta(t, expected, actual, delta, msgAndArgs...) -} - -/* - Errors -*/ - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, actualObj, expectedObj) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if isNil(err) { - return true - } - - return Fail(t, fmt.Sprintf("No error is expected but got %v", err), msgAndArgs...) -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Error(t, err, "An error was expected") { -// assert.Equal(t, err, expectedError) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - - message := messageFromMsgAndArgs(msgAndArgs...) - return NotNil(t, err, "An error is expected but got nil. %s", message) - -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// if assert.Error(t, err, "An error was expected") { -// assert.Equal(t, err, expectedError) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { - - message := messageFromMsgAndArgs(msgAndArgs...) - if !NotNil(t, theError, "An error is expected but got nil. %s", message) { - return false - } - s := "An error with value \"%s\" is expected but got \"%s\". %s" - return Equal(t, theError.Error(), errString, - s, errString, theError.Error(), message) -} - -// matchRegexp return true if a specified regexp matches a string. -func matchRegexp(rx interface{}, str interface{}) bool { - - var r *regexp.Regexp - if rr, ok := rx.(*regexp.Regexp); ok { - r = rr - } else { - r = regexp.MustCompile(fmt.Sprint(rx)) - } - - return (r.FindStringIndex(fmt.Sprint(str)) != nil) - -} - -// Regexp asserts that a specified regexp matches a string. -// -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") -// -// Returns whether the assertion was successful (true) or not (false). -func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - - match := matchRegexp(rx, str) - - if !match { - Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) - } - - return match -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") -// -// Returns whether the assertion was successful (true) or not (false). -func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - match := matchRegexp(rx, str) - - if match { - Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) - } - - return !match - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions_test.go deleted file mode 100644 index 2cb58dbd7..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/assertions_test.go +++ /dev/null @@ -1,768 +0,0 @@ -package assert - -import ( - "errors" - "regexp" - "testing" - "time" -) - -// AssertionTesterInterface defines an interface to be used for testing assertion methods -type AssertionTesterInterface interface { - TestMethod() -} - -// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface -type AssertionTesterConformingObject struct { -} - -func (a *AssertionTesterConformingObject) TestMethod() { -} - -// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface -type AssertionTesterNonConformingObject struct { -} - -func TestObjectsAreEqual(t *testing.T) { - - if !ObjectsAreEqual("Hello World", "Hello World") { - t.Error("objectsAreEqual should return true") - } - if !ObjectsAreEqual(123, 123) { - t.Error("objectsAreEqual should return true") - } - if !ObjectsAreEqual(123.5, 123.5) { - t.Error("objectsAreEqual should return true") - } - if !ObjectsAreEqual([]byte("Hello World"), []byte("Hello World")) { - t.Error("objectsAreEqual should return true") - } - if !ObjectsAreEqual(nil, nil) { - t.Error("objectsAreEqual should return true") - } - if ObjectsAreEqual(map[int]int{5: 10}, map[int]int{10: 20}) { - t.Error("objectsAreEqual should return false") - } - if ObjectsAreEqual('x', "x") { - t.Error("objectsAreEqual should return false") - } - if ObjectsAreEqual("x", 'x') { - t.Error("objectsAreEqual should return false") - } - if ObjectsAreEqual(0, 0.1) { - t.Error("objectsAreEqual should return false") - } - if ObjectsAreEqual(0.1, 0) { - t.Error("objectsAreEqual should return false") - } - if ObjectsAreEqual(uint32(10), int32(10)) { - t.Error("objectsAreEqual should return false") - } - if !ObjectsAreEqualValues(uint32(10), int32(10)) { - t.Error("ObjectsAreEqualValues should return true") - } - -} - -func TestImplements(t *testing.T) { - - mockT := new(testing.T) - - if !Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { - t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") - } - if Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { - t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") - } - -} - -func TestIsType(t *testing.T) { - - mockT := new(testing.T) - - if !IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { - t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") - } - if IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { - t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") - } - -} - -func TestEqual(t *testing.T) { - - mockT := new(testing.T) - - if !Equal(mockT, "Hello World", "Hello World") { - t.Error("Equal should return true") - } - if !Equal(mockT, 123, 123) { - t.Error("Equal should return true") - } - if !Equal(mockT, 123.5, 123.5) { - t.Error("Equal should return true") - } - if !Equal(mockT, []byte("Hello World"), []byte("Hello World")) { - t.Error("Equal should return true") - } - if !Equal(mockT, nil, nil) { - t.Error("Equal should return true") - } - if !Equal(mockT, int32(123), int32(123)) { - t.Error("Equal should return true") - } - if !Equal(mockT, uint64(123), uint64(123)) { - t.Error("Equal should return true") - } - funcA := func() int { return 42 } - if !Equal(mockT, funcA, funcA) { - t.Error("Equal should return true") - } - -} - -func TestNotNil(t *testing.T) { - - mockT := new(testing.T) - - if !NotNil(mockT, new(AssertionTesterConformingObject)) { - t.Error("NotNil should return true: object is not nil") - } - if NotNil(mockT, nil) { - t.Error("NotNil should return false: object is nil") - } - -} - -func TestNil(t *testing.T) { - - mockT := new(testing.T) - - if !Nil(mockT, nil) { - t.Error("Nil should return true: object is nil") - } - if Nil(mockT, new(AssertionTesterConformingObject)) { - t.Error("Nil should return false: object is not nil") - } - -} - -func TestTrue(t *testing.T) { - - mockT := new(testing.T) - - if !True(mockT, true) { - t.Error("True should return true") - } - if True(mockT, false) { - t.Error("True should return false") - } - -} - -func TestFalse(t *testing.T) { - - mockT := new(testing.T) - - if !False(mockT, false) { - t.Error("False should return true") - } - if False(mockT, true) { - t.Error("False should return false") - } - -} - -func TestExactly(t *testing.T) { - - mockT := new(testing.T) - - a := float32(1) - b := float64(1) - c := float32(1) - d := float32(2) - - if Exactly(mockT, a, b) { - t.Error("Exactly should return false") - } - if Exactly(mockT, a, d) { - t.Error("Exactly should return false") - } - if !Exactly(mockT, a, c) { - t.Error("Exactly should return true") - } - - if Exactly(mockT, nil, a) { - t.Error("Exactly should return false") - } - if Exactly(mockT, a, nil) { - t.Error("Exactly should return false") - } - -} - -func TestNotEqual(t *testing.T) { - - mockT := new(testing.T) - - if !NotEqual(mockT, "Hello World", "Hello World!") { - t.Error("NotEqual should return true") - } - if !NotEqual(mockT, 123, 1234) { - t.Error("NotEqual should return true") - } - if !NotEqual(mockT, 123.5, 123.55) { - t.Error("NotEqual should return true") - } - if !NotEqual(mockT, []byte("Hello World"), []byte("Hello World!")) { - t.Error("NotEqual should return true") - } - if !NotEqual(mockT, nil, new(AssertionTesterConformingObject)) { - t.Error("NotEqual should return true") - } - funcA := func() int { return 23 } - funcB := func() int { return 42 } - if !NotEqual(mockT, funcA, funcB) { - t.Error("NotEqual should return true") - } - - if NotEqual(mockT, "Hello World", "Hello World") { - t.Error("NotEqual should return false") - } - if NotEqual(mockT, 123, 123) { - t.Error("NotEqual should return false") - } - if NotEqual(mockT, 123.5, 123.5) { - t.Error("NotEqual should return false") - } - if NotEqual(mockT, []byte("Hello World"), []byte("Hello World")) { - t.Error("NotEqual should return false") - } - if NotEqual(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { - t.Error("NotEqual should return false") - } -} - -type A struct { - Name, Value string -} - -func TestContains(t *testing.T) { - - mockT := new(testing.T) - list := []string{"Foo", "Bar"} - complexList := []*A{ - {"b", "c"}, - {"d", "e"}, - {"g", "h"}, - {"j", "k"}, - } - - if !Contains(mockT, "Hello World", "Hello") { - t.Error("Contains should return true: \"Hello World\" contains \"Hello\"") - } - if Contains(mockT, "Hello World", "Salut") { - t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"") - } - - if !Contains(mockT, list, "Bar") { - t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Bar\"") - } - if Contains(mockT, list, "Salut") { - t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"") - } - if !Contains(mockT, complexList, &A{"g", "h"}) { - t.Error("Contains should return true: complexList contains {\"g\", \"h\"}") - } - if Contains(mockT, complexList, &A{"g", "e"}) { - t.Error("Contains should return false: complexList contains {\"g\", \"e\"}") - } -} - -func TestNotContains(t *testing.T) { - - mockT := new(testing.T) - list := []string{"Foo", "Bar"} - - if !NotContains(mockT, "Hello World", "Hello!") { - t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"") - } - if NotContains(mockT, "Hello World", "Hello") { - t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"") - } - - if !NotContains(mockT, list, "Foo!") { - t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"") - } - if NotContains(mockT, list, "Foo") { - t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") - } - -} - -func Test_includeElement(t *testing.T) { - - list1 := []string{"Foo", "Bar"} - list2 := []int{1, 2} - - ok, found := includeElement("Hello World", "World") - True(t, ok) - True(t, found) - - ok, found = includeElement(list1, "Foo") - True(t, ok) - True(t, found) - - ok, found = includeElement(list1, "Bar") - True(t, ok) - True(t, found) - - ok, found = includeElement(list2, 1) - True(t, ok) - True(t, found) - - ok, found = includeElement(list2, 2) - True(t, ok) - True(t, found) - - ok, found = includeElement(list1, "Foo!") - True(t, ok) - False(t, found) - - ok, found = includeElement(list2, 3) - True(t, ok) - False(t, found) - - ok, found = includeElement(list2, "1") - True(t, ok) - False(t, found) - - ok, found = includeElement(1433, "1") - False(t, ok) - False(t, found) - -} - -func TestCondition(t *testing.T) { - mockT := new(testing.T) - - if !Condition(mockT, func() bool { return true }, "Truth") { - t.Error("Condition should return true") - } - - if Condition(mockT, func() bool { return false }, "Lie") { - t.Error("Condition should return false") - } - -} - -func TestDidPanic(t *testing.T) { - - if funcDidPanic, _ := didPanic(func() { - panic("Panic!") - }); !funcDidPanic { - t.Error("didPanic should return true") - } - - if funcDidPanic, _ := didPanic(func() { - }); funcDidPanic { - t.Error("didPanic should return false") - } - -} - -func TestPanics(t *testing.T) { - - mockT := new(testing.T) - - if !Panics(mockT, func() { - panic("Panic!") - }) { - t.Error("Panics should return true") - } - - if Panics(mockT, func() { - }) { - t.Error("Panics should return false") - } - -} - -func TestNotPanics(t *testing.T) { - - mockT := new(testing.T) - - if !NotPanics(mockT, func() { - }) { - t.Error("NotPanics should return true") - } - - if NotPanics(mockT, func() { - panic("Panic!") - }) { - t.Error("NotPanics should return false") - } - -} - -func TestEqual_Funcs(t *testing.T) { - - type f func() int - f1 := func() int { return 1 } - f2 := func() int { return 2 } - - f1Copy := f1 - - Equal(t, f1Copy, f1, "Funcs are the same and should be considered equal") - NotEqual(t, f1, f2, "f1 and f2 are different") - -} - -func TestNoError(t *testing.T) { - - mockT := new(testing.T) - - // start with a nil error - var err error - - True(t, NoError(mockT, err), "NoError should return True for nil arg") - - // now set an error - err = errors.New("some error") - - False(t, NoError(mockT, err), "NoError with error should return False") - -} - -func TestError(t *testing.T) { - - mockT := new(testing.T) - - // start with a nil error - var err error - - False(t, Error(mockT, err), "Error should return False for nil arg") - - // now set an error - err = errors.New("some error") - - True(t, Error(mockT, err), "Error with error should return True") - -} - -func TestEqualError(t *testing.T) { - mockT := new(testing.T) - - // start with a nil error - var err error - False(t, EqualError(mockT, err, ""), - "EqualError should return false for nil arg") - - // now set an error - err = errors.New("some error") - False(t, EqualError(mockT, err, "Not some error"), - "EqualError should return false for different error string") - True(t, EqualError(mockT, err, "some error"), - "EqualError should return true") -} - -func Test_isEmpty(t *testing.T) { - - chWithValue := make(chan struct{}, 1) - chWithValue <- struct{}{} - - True(t, isEmpty("")) - True(t, isEmpty(nil)) - True(t, isEmpty([]string{})) - True(t, isEmpty(0)) - True(t, isEmpty(int32(0))) - True(t, isEmpty(int64(0))) - True(t, isEmpty(false)) - True(t, isEmpty(map[string]string{})) - True(t, isEmpty(new(time.Time))) - True(t, isEmpty(make(chan struct{}))) - False(t, isEmpty("something")) - False(t, isEmpty(errors.New("something"))) - False(t, isEmpty([]string{"something"})) - False(t, isEmpty(1)) - False(t, isEmpty(true)) - False(t, isEmpty(map[string]string{"Hello": "World"})) - False(t, isEmpty(chWithValue)) - -} - -func TestEmpty(t *testing.T) { - - mockT := new(testing.T) - chWithValue := make(chan struct{}, 1) - chWithValue <- struct{}{} - - True(t, Empty(mockT, ""), "Empty string is empty") - True(t, Empty(mockT, nil), "Nil is empty") - True(t, Empty(mockT, []string{}), "Empty string array is empty") - True(t, Empty(mockT, 0), "Zero int value is empty") - True(t, Empty(mockT, false), "False value is empty") - True(t, Empty(mockT, make(chan struct{})), "Channel without values is empty") - - False(t, Empty(mockT, "something"), "Non Empty string is not empty") - False(t, Empty(mockT, errors.New("something")), "Non nil object is not empty") - False(t, Empty(mockT, []string{"something"}), "Non empty string array is not empty") - False(t, Empty(mockT, 1), "Non-zero int value is not empty") - False(t, Empty(mockT, true), "True value is not empty") - False(t, Empty(mockT, chWithValue), "Channel with values is not empty") -} - -func TestNotEmpty(t *testing.T) { - - mockT := new(testing.T) - chWithValue := make(chan struct{}, 1) - chWithValue <- struct{}{} - - False(t, NotEmpty(mockT, ""), "Empty string is empty") - False(t, NotEmpty(mockT, nil), "Nil is empty") - False(t, NotEmpty(mockT, []string{}), "Empty string array is empty") - False(t, NotEmpty(mockT, 0), "Zero int value is empty") - False(t, NotEmpty(mockT, false), "False value is empty") - False(t, NotEmpty(mockT, make(chan struct{})), "Channel without values is empty") - - True(t, NotEmpty(mockT, "something"), "Non Empty string is not empty") - True(t, NotEmpty(mockT, errors.New("something")), "Non nil object is not empty") - True(t, NotEmpty(mockT, []string{"something"}), "Non empty string array is not empty") - True(t, NotEmpty(mockT, 1), "Non-zero int value is not empty") - True(t, NotEmpty(mockT, true), "True value is not empty") - True(t, NotEmpty(mockT, chWithValue), "Channel with values is not empty") -} - -func Test_getLen(t *testing.T) { - falseCases := []interface{}{ - nil, - 0, - true, - false, - 'A', - struct{}{}, - } - for _, v := range falseCases { - ok, l := getLen(v) - False(t, ok, "Expected getLen fail to get length of %#v", v) - Equal(t, 0, l, "getLen should return 0 for %#v", v) - } - - ch := make(chan int, 5) - ch <- 1 - ch <- 2 - ch <- 3 - trueCases := []struct { - v interface{} - l int - }{ - {[]int{1, 2, 3}, 3}, - {[...]int{1, 2, 3}, 3}, - {"ABC", 3}, - {map[int]int{1: 2, 2: 4, 3: 6}, 3}, - {ch, 3}, - - {[]int{}, 0}, - {map[int]int{}, 0}, - {make(chan int), 0}, - - {[]int(nil), 0}, - {map[int]int(nil), 0}, - {(chan int)(nil), 0}, - } - - for _, c := range trueCases { - ok, l := getLen(c.v) - True(t, ok, "Expected getLen success to get length of %#v", c.v) - Equal(t, c.l, l) - } -} - -func TestLen(t *testing.T) { - mockT := new(testing.T) - - False(t, Len(mockT, nil, 0), "nil does not have length") - False(t, Len(mockT, 0, 0), "int does not have length") - False(t, Len(mockT, true, 0), "true does not have length") - False(t, Len(mockT, false, 0), "false does not have length") - False(t, Len(mockT, 'A', 0), "Rune does not have length") - False(t, Len(mockT, struct{}{}, 0), "Struct does not have length") - - ch := make(chan int, 5) - ch <- 1 - ch <- 2 - ch <- 3 - - cases := []struct { - v interface{} - l int - }{ - {[]int{1, 2, 3}, 3}, - {[...]int{1, 2, 3}, 3}, - {"ABC", 3}, - {map[int]int{1: 2, 2: 4, 3: 6}, 3}, - {ch, 3}, - - {[]int{}, 0}, - {map[int]int{}, 0}, - {make(chan int), 0}, - - {[]int(nil), 0}, - {map[int]int(nil), 0}, - {(chan int)(nil), 0}, - } - - for _, c := range cases { - True(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l) - } - - cases = []struct { - v interface{} - l int - }{ - {[]int{1, 2, 3}, 4}, - {[...]int{1, 2, 3}, 2}, - {"ABC", 2}, - {map[int]int{1: 2, 2: 4, 3: 6}, 4}, - {ch, 2}, - - {[]int{}, 1}, - {map[int]int{}, 1}, - {make(chan int), 1}, - - {[]int(nil), 1}, - {map[int]int(nil), 1}, - {(chan int)(nil), 1}, - } - - for _, c := range cases { - False(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l) - } -} - -func TestWithinDuration(t *testing.T) { - - mockT := new(testing.T) - a := time.Now() - b := a.Add(10 * time.Second) - - True(t, WithinDuration(mockT, a, b, 10*time.Second), "A 10s difference is within a 10s time difference") - True(t, WithinDuration(mockT, b, a, 10*time.Second), "A 10s difference is within a 10s time difference") - - False(t, WithinDuration(mockT, a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") - False(t, WithinDuration(mockT, b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") - - False(t, WithinDuration(mockT, a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") - False(t, WithinDuration(mockT, b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") - - False(t, WithinDuration(mockT, a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") - False(t, WithinDuration(mockT, b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") -} - -func TestInDelta(t *testing.T) { - mockT := new(testing.T) - - True(t, InDelta(mockT, 1.001, 1, 0.01), "|1.001 - 1| <= 0.01") - True(t, InDelta(mockT, 1, 1.001, 0.01), "|1 - 1.001| <= 0.01") - True(t, InDelta(mockT, 1, 2, 1), "|1 - 2| <= 1") - False(t, InDelta(mockT, 1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") - False(t, InDelta(mockT, 2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") - False(t, InDelta(mockT, "", nil, 1), "Expected non numerals to fail") - - cases := []struct { - a, b interface{} - delta float64 - }{ - {uint8(2), uint8(1), 1}, - {uint16(2), uint16(1), 1}, - {uint32(2), uint32(1), 1}, - {uint64(2), uint64(1), 1}, - - {int(2), int(1), 1}, - {int8(2), int8(1), 1}, - {int16(2), int16(1), 1}, - {int32(2), int32(1), 1}, - {int64(2), int64(1), 1}, - - {float32(2), float32(1), 1}, - {float64(2), float64(1), 1}, - } - - for _, tc := range cases { - True(t, InDelta(mockT, tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) - } -} - -func TestInEpsilon(t *testing.T) { - mockT := new(testing.T) - - cases := []struct { - a, b interface{} - epsilon float64 - }{ - {uint8(2), uint16(2), .001}, - {2.1, 2.2, 0.1}, - {2.2, 2.1, 0.1}, - {-2.1, -2.2, 0.1}, - {-2.2, -2.1, 0.1}, - {uint64(100), uint8(101), 0.01}, - {0.1, -0.1, 2}, - } - - for _, tc := range cases { - True(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) - } - - cases = []struct { - a, b interface{} - epsilon float64 - }{ - {uint8(2), int16(-2), .001}, - {uint64(100), uint8(102), 0.01}, - {2.1, 2.2, 0.001}, - {2.2, 2.1, 0.001}, - {2.1, -2.2, 1}, - {2.1, "bla-bla", 0}, - {0.1, -0.1, 1.99}, - } - - for _, tc := range cases { - False(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) - } - -} - -func TestRegexp(t *testing.T) { - mockT := new(testing.T) - - cases := []struct { - rx, str string - }{ - {"^start", "start of the line"}, - {"end$", "in the end"}, - {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, - } - - for _, tc := range cases { - True(t, Regexp(mockT, tc.rx, tc.str)) - True(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) - False(t, NotRegexp(mockT, tc.rx, tc.str)) - False(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) - } - - cases = []struct { - rx, str string - }{ - {"^asdfastart", "Not the start of the line"}, - {"end$", "in the end."}, - {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, - } - - for _, tc := range cases { - False(t, Regexp(mockT, tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) - False(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) - True(t, NotRegexp(mockT, tc.rx, tc.str)) - True(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/doc.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/doc.go deleted file mode 100644 index 1c6de283d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/doc.go +++ /dev/null @@ -1,150 +0,0 @@ -// A set of comprehensive testing tools for use with the normal Go testing system. -// -// Example Usage -// -// The following is a complete example using assert in a standard test function: -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) -// -// func TestSomething(t *testing.T) { -// -// var a string = "Hello" -// var b string = "Hello" -// -// assert.Equal(t, a, b, "The two words should be the same.") -// -// } -// -// if you assert many times, use the below: -// -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) -// -// func TestSomething(t *testing.T) { -// assert := assert.New(t) -// -// var a string = "Hello" -// var b string = "Hello" -// -// assert.Equal(a, b, "The two words should be the same.") -// } -// -// Assertions -// -// Assertions allow you to easily write test code, and are global funcs in the `assert` package. -// All assertion functions take, as the first argument, the `*testing.T` object provided by the -// testing framework. This allows the assertion funcs to write the failings and other details to -// the correct place. -// -// Every assertion function also takes an optional string message as the final argument, -// allowing custom error messages to be appended to the message the assertion method outputs. -// -// Here is an overview of the assert functions: -// -// assert.Equal(t, expected, actual [, message [, format-args]) -// -// assert.NotEqual(t, notExpected, actual [, message [, format-args]]) -// -// assert.True(t, actualBool [, message [, format-args]]) -// -// assert.False(t, actualBool [, message [, format-args]]) -// -// assert.Nil(t, actualObject [, message [, format-args]]) -// -// assert.NotNil(t, actualObject [, message [, format-args]]) -// -// assert.Empty(t, actualObject [, message [, format-args]]) -// -// assert.NotEmpty(t, actualObject [, message [, format-args]]) -// -// assert.Len(t, actualObject, expectedLength, [, message [, format-args]]) -// -// assert.Error(t, errorObject [, message [, format-args]]) -// -// assert.NoError(t, errorObject [, message [, format-args]]) -// -// assert.EqualError(t, theError, errString [, message [, format-args]]) -// -// assert.Implements(t, (*MyInterface)(nil), new(MyObject) [,message [, format-args]]) -// -// assert.IsType(t, expectedObject, actualObject [, message [, format-args]]) -// -// assert.Contains(t, stringOrSlice, substringOrElement [, message [, format-args]]) -// -// assert.NotContains(t, stringOrSlice, substringOrElement [, message [, format-args]]) -// -// assert.Panics(t, func(){ -// -// // call code that should panic -// -// } [, message [, format-args]]) -// -// assert.NotPanics(t, func(){ -// -// // call code that should not panic -// -// } [, message [, format-args]]) -// -// assert.WithinDuration(t, timeA, timeB, deltaTime, [, message [, format-args]]) -// -// assert.InDelta(t, numA, numB, delta, [, message [, format-args]]) -// -// assert.InEpsilon(t, numA, numB, epsilon, [, message [, format-args]]) -// -// assert package contains Assertions object. it has assertion methods. -// -// Here is an overview of the assert functions: -// assert.Equal(expected, actual [, message [, format-args]) -// -// assert.NotEqual(notExpected, actual [, message [, format-args]]) -// -// assert.True(actualBool [, message [, format-args]]) -// -// assert.False(actualBool [, message [, format-args]]) -// -// assert.Nil(actualObject [, message [, format-args]]) -// -// assert.NotNil(actualObject [, message [, format-args]]) -// -// assert.Empty(actualObject [, message [, format-args]]) -// -// assert.NotEmpty(actualObject [, message [, format-args]]) -// -// assert.Len(actualObject, expectedLength, [, message [, format-args]]) -// -// assert.Error(errorObject [, message [, format-args]]) -// -// assert.NoError(errorObject [, message [, format-args]]) -// -// assert.EqualError(theError, errString [, message [, format-args]]) -// -// assert.Implements((*MyInterface)(nil), new(MyObject) [,message [, format-args]]) -// -// assert.IsType(expectedObject, actualObject [, message [, format-args]]) -// -// assert.Contains(stringOrSlice, substringOrElement [, message [, format-args]]) -// -// assert.NotContains(stringOrSlice, substringOrElement [, message [, format-args]]) -// -// assert.Panics(func(){ -// -// // call code that should panic -// -// } [, message [, format-args]]) -// -// assert.NotPanics(func(){ -// -// // call code that should not panic -// -// } [, message [, format-args]]) -// -// assert.WithinDuration(timeA, timeB, deltaTime, [, message [, format-args]]) -// -// assert.InDelta(numA, numB, delta, [, message [, format-args]]) -// -// assert.InEpsilon(numA, numB, epsilon, [, message [, format-args]]) -package assert diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/errors.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/errors.go deleted file mode 100644 index ac9dc9d1d..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package assert - -import ( - "errors" -) - -// AnError is an error instance useful for testing. If the code does not care -// about error specifics, and only needs to return the error for example, this -// error should be used to make the test code more readable. -var AnError = errors.New("assert.AnError general error for testing") diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions.go deleted file mode 100644 index 67a6925a1..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions.go +++ /dev/null @@ -1,262 +0,0 @@ -package assert - -import "time" - -type Assertions struct { - t TestingT -} - -func New(t TestingT) *Assertions { - return &Assertions{ - t: t, - } -} - -// Fail reports a failure through -func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { - return Fail(a.t, failureMessage, msgAndArgs...) -} - -// Implements asserts that an object is implemented by the specified interface. -// -// assert.Implements((*MyInterface)(nil), new(MyObject), "MyObject") -func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - return Implements(a.t, interfaceObject, object, msgAndArgs...) -} - -// IsType asserts that the specified objects are of the same type. -func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - return IsType(a.t, expectedType, object, msgAndArgs...) -} - -// Equal asserts that two objects are equal. -// -// assert.Equal(123, 123, "123 and 123 should be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Equal(expected, actual interface{}, msgAndArgs ...interface{}) bool { - return Equal(a.t, expected, actual, msgAndArgs...) -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValues(uint32(123), int32(123), "123 and 123 should be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) EqualValues(expected, actual interface{}, msgAndArgs ...interface{}) bool { - return EqualValues(a.t, expected, actual, msgAndArgs...) -} - -// Exactly asserts that two objects are equal is value and type. -// -// assert.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Exactly(expected, actual interface{}, msgAndArgs ...interface{}) bool { - return Exactly(a.t, expected, actual, msgAndArgs...) -} - -// NotNil asserts that the specified object is not nil. -// -// assert.NotNil(err, "err should be something") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { - return NotNil(a.t, object, msgAndArgs...) -} - -// Nil asserts that the specified object is nil. -// -// assert.Nil(err, "err should be nothing") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { - return Nil(a.t, object, msgAndArgs...) -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or a -// slice with len == 0. -// -// assert.Empty(obj) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { - return Empty(a.t, object, msgAndArgs...) -} - -// Empty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or a -// slice with len == 0. -// -// if assert.NotEmpty(obj) { -// assert.Equal("two", obj[1]) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { - return NotEmpty(a.t, object, msgAndArgs...) -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// assert.Len(mySlice, 3, "The size of slice is not 3") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { - return Len(a.t, object, length, msgAndArgs...) -} - -// True asserts that the specified value is true. -// -// assert.True(myBool, "myBool should be true") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { - return True(a.t, value, msgAndArgs...) -} - -// False asserts that the specified value is true. -// -// assert.False(myBool, "myBool should be false") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { - return False(a.t, value, msgAndArgs...) -} - -// NotEqual asserts that the specified values are NOT equal. -// -// assert.NotEqual(obj1, obj2, "two objects shouldn't be equal") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotEqual(expected, actual interface{}, msgAndArgs ...interface{}) bool { - return NotEqual(a.t, expected, actual, msgAndArgs...) -} - -// Contains asserts that the specified string contains the specified substring. -// -// assert.Contains("Hello World", "World", "But 'Hello World' does contain 'World'") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Contains(s, contains interface{}, msgAndArgs ...interface{}) bool { - return Contains(a.t, s, contains, msgAndArgs...) -} - -// NotContains asserts that the specified string does NOT contain the specified substring. -// -// assert.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotContains(s, contains interface{}, msgAndArgs ...interface{}) bool { - return NotContains(a.t, s, contains, msgAndArgs...) -} - -// Uses a Comparison to assert a complex condition. -func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { - return Condition(a.t, comp, msgAndArgs...) -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panics(func(){ -// GoCrazy() -// }, "Calling GoCrazy() should panic") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - return Panics(a.t, f, msgAndArgs...) -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanics(func(){ -// RemainCalm() -// }, "Calling RemainCalm() should NOT panic") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - return NotPanics(a.t, f, msgAndArgs...) -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// assert.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) WithinDuration(expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) InDelta(expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - return InDelta(a.t, expected, actual, delta, msgAndArgs...) -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) InEpsilon(expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) -} - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoError(err) { -// assert.Equal(actualObj, expectedObj) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NoError(theError error, msgAndArgs ...interface{}) bool { - return NoError(a.t, theError, msgAndArgs...) -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Error(err, "An error was expected") { -// assert.Equal(err, expectedError) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Error(theError error, msgAndArgs ...interface{}) bool { - return Error(a.t, theError, msgAndArgs...) -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// if assert.Error(err, "An error was expected") { -// assert.Equal(err, expectedError) -// } -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { - return EqualError(a.t, theError, errString, msgAndArgs...) -} - -// Regexp asserts that a specified regexp matches a string. -// -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - return Regexp(a.t, rx, str, msgAndArgs...) -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - return NotRegexp(a.t, rx, str, msgAndArgs...) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions_test.go deleted file mode 100644 index 0dac6c7ae..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/forward_assertions_test.go +++ /dev/null @@ -1,526 +0,0 @@ -package assert - -import ( - "errors" - "regexp" - "testing" - "time" -) - -func TestImplementsWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { - t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") - } - if assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { - t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") - } -} - -func TestIsTypeWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { - t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") - } - if assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { - t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") - } - -} - -func TestEqualWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.Equal("Hello World", "Hello World") { - t.Error("Equal should return true") - } - if !assert.Equal(123, 123) { - t.Error("Equal should return true") - } - if !assert.Equal(123.5, 123.5) { - t.Error("Equal should return true") - } - if !assert.Equal([]byte("Hello World"), []byte("Hello World")) { - t.Error("Equal should return true") - } - if !assert.Equal(nil, nil) { - t.Error("Equal should return true") - } -} - -func TestEqualValuesWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.EqualValues(uint32(10), int32(10)) { - t.Error("EqualValues should return true") - } -} - -func TestNotNilWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.NotNil(new(AssertionTesterConformingObject)) { - t.Error("NotNil should return true: object is not nil") - } - if assert.NotNil(nil) { - t.Error("NotNil should return false: object is nil") - } - -} - -func TestNilWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.Nil(nil) { - t.Error("Nil should return true: object is nil") - } - if assert.Nil(new(AssertionTesterConformingObject)) { - t.Error("Nil should return false: object is not nil") - } - -} - -func TestTrueWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.True(true) { - t.Error("True should return true") - } - if assert.True(false) { - t.Error("True should return false") - } - -} - -func TestFalseWrapper(t *testing.T) { - assert := New(new(testing.T)) - - if !assert.False(false) { - t.Error("False should return true") - } - if assert.False(true) { - t.Error("False should return false") - } - -} - -func TestExactlyWrapper(t *testing.T) { - assert := New(new(testing.T)) - - a := float32(1) - b := float64(1) - c := float32(1) - d := float32(2) - - if assert.Exactly(a, b) { - t.Error("Exactly should return false") - } - if assert.Exactly(a, d) { - t.Error("Exactly should return false") - } - if !assert.Exactly(a, c) { - t.Error("Exactly should return true") - } - - if assert.Exactly(nil, a) { - t.Error("Exactly should return false") - } - if assert.Exactly(a, nil) { - t.Error("Exactly should return false") - } - -} - -func TestNotEqualWrapper(t *testing.T) { - - assert := New(new(testing.T)) - - if !assert.NotEqual("Hello World", "Hello World!") { - t.Error("NotEqual should return true") - } - if !assert.NotEqual(123, 1234) { - t.Error("NotEqual should return true") - } - if !assert.NotEqual(123.5, 123.55) { - t.Error("NotEqual should return true") - } - if !assert.NotEqual([]byte("Hello World"), []byte("Hello World!")) { - t.Error("NotEqual should return true") - } - if !assert.NotEqual(nil, new(AssertionTesterConformingObject)) { - t.Error("NotEqual should return true") - } -} - -func TestContainsWrapper(t *testing.T) { - - assert := New(new(testing.T)) - list := []string{"Foo", "Bar"} - - if !assert.Contains("Hello World", "Hello") { - t.Error("Contains should return true: \"Hello World\" contains \"Hello\"") - } - if assert.Contains("Hello World", "Salut") { - t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"") - } - - if !assert.Contains(list, "Foo") { - t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") - } - if assert.Contains(list, "Salut") { - t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"") - } - -} - -func TestNotContainsWrapper(t *testing.T) { - - assert := New(new(testing.T)) - list := []string{"Foo", "Bar"} - - if !assert.NotContains("Hello World", "Hello!") { - t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"") - } - if assert.NotContains("Hello World", "Hello") { - t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"") - } - - if !assert.NotContains(list, "Foo!") { - t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"") - } - if assert.NotContains(list, "Foo") { - t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") - } - -} - -func TestConditionWrapper(t *testing.T) { - - assert := New(new(testing.T)) - - if !assert.Condition(func() bool { return true }, "Truth") { - t.Error("Condition should return true") - } - - if assert.Condition(func() bool { return false }, "Lie") { - t.Error("Condition should return false") - } - -} - -func TestDidPanicWrapper(t *testing.T) { - - if funcDidPanic, _ := didPanic(func() { - panic("Panic!") - }); !funcDidPanic { - t.Error("didPanic should return true") - } - - if funcDidPanic, _ := didPanic(func() { - }); funcDidPanic { - t.Error("didPanic should return false") - } - -} - -func TestPanicsWrapper(t *testing.T) { - - assert := New(new(testing.T)) - - if !assert.Panics(func() { - panic("Panic!") - }) { - t.Error("Panics should return true") - } - - if assert.Panics(func() { - }) { - t.Error("Panics should return false") - } - -} - -func TestNotPanicsWrapper(t *testing.T) { - - assert := New(new(testing.T)) - - if !assert.NotPanics(func() { - }) { - t.Error("NotPanics should return true") - } - - if assert.NotPanics(func() { - panic("Panic!") - }) { - t.Error("NotPanics should return false") - } - -} - -func TestEqualWrapper_Funcs(t *testing.T) { - - assert := New(t) - - type f func() int - var f1 f = func() int { return 1 } - var f2 f = func() int { return 2 } - - var f1_copy f = f1 - - assert.Equal(f1_copy, f1, "Funcs are the same and should be considered equal") - assert.NotEqual(f1, f2, "f1 and f2 are different") - -} - -func TestNoErrorWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - // start with a nil error - var err error = nil - - assert.True(mockAssert.NoError(err), "NoError should return True for nil arg") - - // now set an error - err = errors.New("Some error") - - assert.False(mockAssert.NoError(err), "NoError with error should return False") - -} - -func TestErrorWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - // start with a nil error - var err error = nil - - assert.False(mockAssert.Error(err), "Error should return False for nil arg") - - // now set an error - err = errors.New("Some error") - - assert.True(mockAssert.Error(err), "Error with error should return True") - -} - -func TestEqualErrorWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - // start with a nil error - var err error - assert.False(mockAssert.EqualError(err, ""), - "EqualError should return false for nil arg") - - // now set an error - err = errors.New("some error") - assert.False(mockAssert.EqualError(err, "Not some error"), - "EqualError should return false for different error string") - assert.True(mockAssert.EqualError(err, "some error"), - "EqualError should return true") -} - -func TestEmptyWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - assert.True(mockAssert.Empty(""), "Empty string is empty") - assert.True(mockAssert.Empty(nil), "Nil is empty") - assert.True(mockAssert.Empty([]string{}), "Empty string array is empty") - assert.True(mockAssert.Empty(0), "Zero int value is empty") - assert.True(mockAssert.Empty(false), "False value is empty") - - assert.False(mockAssert.Empty("something"), "Non Empty string is not empty") - assert.False(mockAssert.Empty(errors.New("something")), "Non nil object is not empty") - assert.False(mockAssert.Empty([]string{"something"}), "Non empty string array is not empty") - assert.False(mockAssert.Empty(1), "Non-zero int value is not empty") - assert.False(mockAssert.Empty(true), "True value is not empty") - -} - -func TestNotEmptyWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - assert.False(mockAssert.NotEmpty(""), "Empty string is empty") - assert.False(mockAssert.NotEmpty(nil), "Nil is empty") - assert.False(mockAssert.NotEmpty([]string{}), "Empty string array is empty") - assert.False(mockAssert.NotEmpty(0), "Zero int value is empty") - assert.False(mockAssert.NotEmpty(false), "False value is empty") - - assert.True(mockAssert.NotEmpty("something"), "Non Empty string is not empty") - assert.True(mockAssert.NotEmpty(errors.New("something")), "Non nil object is not empty") - assert.True(mockAssert.NotEmpty([]string{"something"}), "Non empty string array is not empty") - assert.True(mockAssert.NotEmpty(1), "Non-zero int value is not empty") - assert.True(mockAssert.NotEmpty(true), "True value is not empty") - -} - -func TestLenWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - assert.False(mockAssert.Len(nil, 0), "nil does not have length") - assert.False(mockAssert.Len(0, 0), "int does not have length") - assert.False(mockAssert.Len(true, 0), "true does not have length") - assert.False(mockAssert.Len(false, 0), "false does not have length") - assert.False(mockAssert.Len('A', 0), "Rune does not have length") - assert.False(mockAssert.Len(struct{}{}, 0), "Struct does not have length") - - ch := make(chan int, 5) - ch <- 1 - ch <- 2 - ch <- 3 - - cases := []struct { - v interface{} - l int - }{ - {[]int{1, 2, 3}, 3}, - {[...]int{1, 2, 3}, 3}, - {"ABC", 3}, - {map[int]int{1: 2, 2: 4, 3: 6}, 3}, - {ch, 3}, - - {[]int{}, 0}, - {map[int]int{}, 0}, - {make(chan int), 0}, - - {[]int(nil), 0}, - {map[int]int(nil), 0}, - {(chan int)(nil), 0}, - } - - for _, c := range cases { - assert.True(mockAssert.Len(c.v, c.l), "%#v have %d items", c.v, c.l) - } -} - -func TestWithinDurationWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - a := time.Now() - b := a.Add(10 * time.Second) - - assert.True(mockAssert.WithinDuration(a, b, 10*time.Second), "A 10s difference is within a 10s time difference") - assert.True(mockAssert.WithinDuration(b, a, 10*time.Second), "A 10s difference is within a 10s time difference") - - assert.False(mockAssert.WithinDuration(a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") - assert.False(mockAssert.WithinDuration(b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") - - assert.False(mockAssert.WithinDuration(a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") - assert.False(mockAssert.WithinDuration(b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") - - assert.False(mockAssert.WithinDuration(a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") - assert.False(mockAssert.WithinDuration(b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") -} - -func TestInDeltaWrapper(t *testing.T) { - assert := New(new(testing.T)) - - True(t, assert.InDelta(1.001, 1, 0.01), "|1.001 - 1| <= 0.01") - True(t, assert.InDelta(1, 1.001, 0.01), "|1 - 1.001| <= 0.01") - True(t, assert.InDelta(1, 2, 1), "|1 - 2| <= 1") - False(t, assert.InDelta(1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") - False(t, assert.InDelta(2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") - False(t, assert.InDelta("", nil, 1), "Expected non numerals to fail") - - cases := []struct { - a, b interface{} - delta float64 - }{ - {uint8(2), uint8(1), 1}, - {uint16(2), uint16(1), 1}, - {uint32(2), uint32(1), 1}, - {uint64(2), uint64(1), 1}, - - {int(2), int(1), 1}, - {int8(2), int8(1), 1}, - {int16(2), int16(1), 1}, - {int32(2), int32(1), 1}, - {int64(2), int64(1), 1}, - - {float32(2), float32(1), 1}, - {float64(2), float64(1), 1}, - } - - for _, tc := range cases { - True(t, assert.InDelta(tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) - } -} - -func TestInEpsilonWrapper(t *testing.T) { - assert := New(new(testing.T)) - - cases := []struct { - a, b interface{} - epsilon float64 - }{ - {uint8(2), uint16(2), .001}, - {2.1, 2.2, 0.1}, - {2.2, 2.1, 0.1}, - {-2.1, -2.2, 0.1}, - {-2.2, -2.1, 0.1}, - {uint64(100), uint8(101), 0.01}, - {0.1, -0.1, 2}, - } - - for _, tc := range cases { - True(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) - } - - cases = []struct { - a, b interface{} - epsilon float64 - }{ - {uint8(2), int16(-2), .001}, - {uint64(100), uint8(102), 0.01}, - {2.1, 2.2, 0.001}, - {2.2, 2.1, 0.001}, - {2.1, -2.2, 1}, - {2.1, "bla-bla", 0}, - {0.1, -0.1, 1.99}, - } - - for _, tc := range cases { - False(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) - } -} - -func TestRegexpWrapper(t *testing.T) { - - assert := New(new(testing.T)) - - cases := []struct { - rx, str string - }{ - {"^start", "start of the line"}, - {"end$", "in the end"}, - {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, - } - - for _, tc := range cases { - True(t, assert.Regexp(tc.rx, tc.str)) - True(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) - False(t, assert.NotRegexp(tc.rx, tc.str)) - False(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) - } - - cases = []struct { - rx, str string - }{ - {"^asdfastart", "Not the start of the line"}, - {"end$", "in the end."}, - {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, - } - - for _, tc := range cases { - False(t, assert.Regexp(tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) - False(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) - True(t, assert.NotRegexp(tc.rx, tc.str)) - True(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) - } -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions.go deleted file mode 100644 index 0419c1b60..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions.go +++ /dev/null @@ -1,157 +0,0 @@ -package assert - -import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "strings" -) - -// httpCode is a helper that returns HTTP code of the response. It returns -1 -// if building a new request fails. -func httpCode(handler http.HandlerFunc, mode, url string, values url.Values) int { - w := httptest.NewRecorder() - req, err := http.NewRequest(mode, url+"?"+values.Encode(), nil) - if err != nil { - return -1 - } - handler(w, req) - return w.Code -} - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccess(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool { - code := httpCode(handler, mode, url, values) - if code == -1 { - return false - } - return code >= http.StatusOK && code <= http.StatusPartialContent -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPRedirect(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool { - code := httpCode(handler, mode, url, values) - if code == -1 { - return false - } - return code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPError(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool { - code := httpCode(handler, mode, url, values) - if code == -1 { - return false - } - return code >= http.StatusBadRequest -} - -// HttpBody is a helper that returns HTTP body of the response. It returns -// empty string if building a new request fails. -func HttpBody(handler http.HandlerFunc, mode, url string, values url.Values) string { - w := httptest.NewRecorder() - req, err := http.NewRequest(mode, url+"?"+values.Encode(), nil) - if err != nil { - return "" - } - handler(w, req) - return w.Body.String() -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool { - body := HttpBody(handler, mode, url, values) - - contains := strings.Contains(body, fmt.Sprint(str)) - if !contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) - } - - return contains -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool { - body := HttpBody(handler, mode, url, values) - - contains := strings.Contains(body, fmt.Sprint(str)) - if contains { - Fail(t, "Expected response body for %s to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body) - } - - return !contains -} - -// -// Assertions Wrappers -// - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, mode, url string, values url.Values) bool { - return HTTPSuccess(a.t, handler, mode, url, values) -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, mode, url string, values url.Values) bool { - return HTTPRedirect(a.t, handler, mode, url, values) -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// assert.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPError(handler http.HandlerFunc, mode, url string, values url.Values) bool { - return HTTPError(a.t, handler, mode, url, values) -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool { - return HTTPBodyContains(a.t, handler, mode, url, values, str) -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool { - return HTTPBodyNotContains(a.t, handler, mode, url, values, str) -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions_test.go deleted file mode 100644 index 684c2d5d1..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/assert/http_assertions_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package assert - -import ( - "fmt" - "net/http" - "net/url" - "testing" -) - -func httpOK(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) -} - -func httpRedirect(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusTemporaryRedirect) -} - -func httpError(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusInternalServerError) -} - -func TestHTTPStatuses(t *testing.T) { - assert := New(t) - mockT := new(testing.T) - - assert.Equal(HTTPSuccess(mockT, httpOK, "GET", "/", nil), true) - assert.Equal(HTTPSuccess(mockT, httpRedirect, "GET", "/", nil), false) - assert.Equal(HTTPSuccess(mockT, httpError, "GET", "/", nil), false) - - assert.Equal(HTTPRedirect(mockT, httpOK, "GET", "/", nil), false) - assert.Equal(HTTPRedirect(mockT, httpRedirect, "GET", "/", nil), true) - assert.Equal(HTTPRedirect(mockT, httpError, "GET", "/", nil), false) - - assert.Equal(HTTPError(mockT, httpOK, "GET", "/", nil), false) - assert.Equal(HTTPError(mockT, httpRedirect, "GET", "/", nil), false) - assert.Equal(HTTPError(mockT, httpError, "GET", "/", nil), true) -} - -func TestHTTPStatusesWrapper(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - assert.Equal(mockAssert.HTTPSuccess(httpOK, "GET", "/", nil), true) - assert.Equal(mockAssert.HTTPSuccess(httpRedirect, "GET", "/", nil), false) - assert.Equal(mockAssert.HTTPSuccess(httpError, "GET", "/", nil), false) - - assert.Equal(mockAssert.HTTPRedirect(httpOK, "GET", "/", nil), false) - assert.Equal(mockAssert.HTTPRedirect(httpRedirect, "GET", "/", nil), true) - assert.Equal(mockAssert.HTTPRedirect(httpError, "GET", "/", nil), false) - - assert.Equal(mockAssert.HTTPError(httpOK, "GET", "/", nil), false) - assert.Equal(mockAssert.HTTPError(httpRedirect, "GET", "/", nil), false) - assert.Equal(mockAssert.HTTPError(httpError, "GET", "/", nil), true) -} - -func httpHelloName(w http.ResponseWriter, r *http.Request) { - name := r.FormValue("name") - w.Write([]byte(fmt.Sprintf("Hello, %s!", name))) -} - -func TestHttpBody(t *testing.T) { - assert := New(t) - mockT := new(testing.T) - - assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) - assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) - assert.False(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) - - assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) - assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) - assert.True(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) -} - -func TestHttpBodyWrappers(t *testing.T) { - assert := New(t) - mockAssert := New(new(testing.T)) - - assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) - assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) - assert.False(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) - - assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) - assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) - assert.True(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) - -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/doc.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/doc.go deleted file mode 100644 index dd385074b..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -// Provides a system by which it is possible to mock your objects and verify calls are happening as expected. -// -// Example Usage -// -// The mock package provides an object, Mock, that tracks activity on another object. It is usually -// embedded into a test object as shown below: -// -// type MyTestObject struct { -// // add a Mock object instance -// mock.Mock -// -// // other fields go here as normal -// } -// -// When implementing the methods of an interface, you wire your functions up -// to call the Mock.Called(args...) method, and return the appropriate values. -// -// For example, to mock a method that saves the name and age of a person and returns -// the year of their birth or an error, you might write this: -// -// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) { -// args := o.Called(firstname, lastname, age) -// return args.Int(0), args.Error(1) -// } -// -// The Int, Error and Bool methods are examples of strongly typed getters that take the argument -// index position. Given this argument list: -// -// (12, true, "Something") -// -// You could read them out strongly typed like this: -// -// args.Int(0) -// args.Bool(1) -// args.String(2) -// -// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion: -// -// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine) -// -// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those -// cases you should check for nil first. -package mock diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock.go deleted file mode 100644 index f73fa2516..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock.go +++ /dev/null @@ -1,510 +0,0 @@ -package mock - -import ( - "fmt" - "github.com/stretchr/objx" - "github.com/stretchr/testify/assert" - "reflect" - "runtime" - "strings" - "sync" -) - -// TestingT is an interface wrapper around *testing.T -type TestingT interface { - Logf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) -} - -/* - Call -*/ - -// Call represents a method call and is used for setting expectations, -// as well as recording activity. -type Call struct { - - // The name of the method that was or will be called. - Method string - - // Holds the arguments of the method. - Arguments Arguments - - // Holds the arguments that should be returned when - // this method is called. - ReturnArguments Arguments - - // The number of times to return the return arguments when setting - // expectations. 0 means to always return the value. - Repeatability int -} - -// Mock is the workhorse used to track activity on another object. -// For an example of its usage, refer to the "Example Usage" section at the top of this document. -type Mock struct { - - // The method name that is currently - // being referred to by the On method. - onMethodName string - - // An array of the arguments that are - // currently being referred to by the On method. - onMethodArguments Arguments - - // Represents the calls that are expected of - // an object. - ExpectedCalls []Call - - // Holds the calls that were made to this mocked object. - Calls []Call - - // TestData holds any data that might be useful for testing. Testify ignores - // this data completely allowing you to do whatever you like with it. - testData objx.Map - - mutex sync.Mutex -} - -// TestData holds any data that might be useful for testing. Testify ignores -// this data completely allowing you to do whatever you like with it. -func (m *Mock) TestData() objx.Map { - - if m.testData == nil { - m.testData = make(objx.Map) - } - - return m.testData -} - -/* - Setting expectations -*/ - -// On starts a description of an expectation of the specified method -// being called. -// -// Mock.On("MyMethod", arg1, arg2) -func (m *Mock) On(methodName string, arguments ...interface{}) *Mock { - m.onMethodName = methodName - m.onMethodArguments = arguments - return m -} - -// Return finishes a description of an expectation of the method (and arguments) -// specified in the most recent On method call. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2) -func (m *Mock) Return(returnArguments ...interface{}) *Mock { - m.ExpectedCalls = append(m.ExpectedCalls, Call{m.onMethodName, m.onMethodArguments, returnArguments, 0}) - return m -} - -// Once indicates that that the mock should only return the value once. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once() -func (m *Mock) Once() { - m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = 1 -} - -// Twice indicates that that the mock should only return the value twice. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice() -func (m *Mock) Twice() { - m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = 2 -} - -// Times indicates that that the mock should only return the indicated number -// of times. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5) -func (m *Mock) Times(i int) { - m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = i -} - -/* - Recording and responding to activity -*/ - -func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) { - for i, call := range m.ExpectedCalls { - if call.Method == method && call.Repeatability > -1 { - - _, diffCount := call.Arguments.Diff(arguments) - if diffCount == 0 { - return i, &call - } - - } - } - return -1, nil -} - -func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) { - - diffCount := 0 - var closestCall *Call = nil - - for _, call := range m.ExpectedCalls { - if call.Method == method { - - _, tempDiffCount := call.Arguments.Diff(arguments) - if tempDiffCount < diffCount || diffCount == 0 { - diffCount = tempDiffCount - closestCall = &call - } - - } - } - - if closestCall == nil { - return false, nil - } - - return true, closestCall -} - -func callString(method string, arguments Arguments, includeArgumentValues bool) string { - - var argValsString string = "" - if includeArgumentValues { - var argVals []string - for argIndex, arg := range arguments { - argVals = append(argVals, fmt.Sprintf("%d: %v", argIndex, arg)) - } - argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t")) - } - - return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString) -} - -// Called tells the mock object that a method has been called, and gets an array -// of arguments to return. Panics if the call is unexpected (i.e. not preceeded by -// appropriate .On .Return() calls) -func (m *Mock) Called(arguments ...interface{}) Arguments { - defer m.mutex.Unlock() - m.mutex.Lock() - - // get the calling function's name - pc, _, _, ok := runtime.Caller(1) - if !ok { - panic("Couldn't get the caller information") - } - functionPath := runtime.FuncForPC(pc).Name() - parts := strings.Split(functionPath, ".") - functionName := parts[len(parts)-1] - - found, call := m.findExpectedCall(functionName, arguments...) - - switch { - case found < 0: - // we have to fail here - because we don't know what to do - // as the return arguments. This is because: - // - // a) this is a totally unexpected call to this method, - // b) the arguments are not what was expected, or - // c) the developer has forgotten to add an accompanying On...Return pair. - - closestFound, closestCall := m.findClosestCall(functionName, arguments...) - - if closestFound { - panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n", callString(functionName, arguments, true), callString(functionName, closestCall.Arguments, true))) - } else { - panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", functionName, functionName, callString(functionName, arguments, true), assert.CallerInfo())) - } - case call.Repeatability == 1: - call.Repeatability = -1 - m.ExpectedCalls[found] = *call - case call.Repeatability > 1: - call.Repeatability -= 1 - m.ExpectedCalls[found] = *call - } - - // add the call - m.Calls = append(m.Calls, Call{functionName, arguments, make([]interface{}, 0), 0}) - - return call.ReturnArguments - -} - -/* - Assertions -*/ - -// AssertExpectationsForObjects asserts that everything specified with On and Return -// of the specified objects was in fact called as expected. -// -// Calls may have occurred in any order. -func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool { - var success bool = true - for _, obj := range testObjects { - mockObj := obj.(Mock) - success = success && mockObj.AssertExpectations(t) - } - return success -} - -// AssertExpectations asserts that everything specified with On and Return was -// in fact called as expected. Calls may have occurred in any order. -func (m *Mock) AssertExpectations(t TestingT) bool { - - var somethingMissing bool = false - var failedExpectations int = 0 - - // iterate through each expectation - for _, expectedCall := range m.ExpectedCalls { - switch { - case !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments): - somethingMissing = true - failedExpectations++ - t.Logf("\u274C\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) - case expectedCall.Repeatability > 0: - somethingMissing = true - failedExpectations++ - default: - t.Logf("\u2705\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) - } - } - - if somethingMissing { - t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(m.ExpectedCalls)-failedExpectations, len(m.ExpectedCalls), failedExpectations, assert.CallerInfo()) - } - - return !somethingMissing -} - -// AssertNumberOfCalls asserts that the method was called expectedCalls times. -func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool { - var actualCalls int = 0 - for _, call := range m.Calls { - if call.Method == methodName { - actualCalls++ - } - } - return assert.Equal(t, actualCalls, expectedCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls)) -} - -// AssertCalled asserts that the method was called. -func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool { - if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) { - t.Logf("%s", m.ExpectedCalls) - return false - } - return true -} - -// AssertNotCalled asserts that the method was not called. -func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool { - if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) { - t.Logf("%s", m.ExpectedCalls) - return false - } - return true -} - -func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { - for _, call := range m.Calls { - if call.Method == methodName { - - _, differences := Arguments(expected).Diff(call.Arguments) - - if differences == 0 { - // found the expected call - return true - } - - } - } - // we didn't find the expected call - return false -} - -/* - Arguments -*/ - -// Arguments holds an array of method arguments or return values. -type Arguments []interface{} - -const ( - // The "any" argument. Used in Diff and Assert when - // the argument being tested shouldn't be taken into consideration. - Anything string = "mock.Anything" -) - -// AnythingOfTypeArgument is a string that contains the type of an argument -// for use when type checking. Used in Diff and Assert. -type AnythingOfTypeArgument string - -// AnythingOfType returns an AnythingOfTypeArgument object containing the -// name of the type to check for. Used in Diff and Assert. -// -// For example: -// Assert(t, AnythingOfType("string"), AnythingOfType("int")) -func AnythingOfType(t string) AnythingOfTypeArgument { - return AnythingOfTypeArgument(t) -} - -// Get Returns the argument at the specified index. -func (args Arguments) Get(index int) interface{} { - if index+1 > len(args) { - panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args))) - } - return args[index] -} - -// Is gets whether the objects match the arguments specified. -func (args Arguments) Is(objects ...interface{}) bool { - for i, obj := range args { - if obj != objects[i] { - return false - } - } - return true -} - -// Diff gets a string describing the differences between the arguments -// and the specified objects. -// -// Returns the diff string and number of differences found. -func (args Arguments) Diff(objects []interface{}) (string, int) { - - var output string = "\n" - var differences int - - var maxArgCount int = len(args) - if len(objects) > maxArgCount { - maxArgCount = len(objects) - } - - for i := 0; i < maxArgCount; i++ { - var actual, expected interface{} - - if len(objects) <= i { - actual = "(Missing)" - } else { - actual = objects[i] - } - - if len(args) <= i { - expected = "(Missing)" - } else { - expected = args[i] - } - - if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() { - - // type checking - if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) { - // not match - differences++ - output = fmt.Sprintf("%s\t%d: \u274C type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual) - } - - } else { - - // normal checking - - if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) { - // match - output = fmt.Sprintf("%s\t%d: \u2705 %s == %s\n", output, i, actual, expected) - } else { - // not match - differences++ - output = fmt.Sprintf("%s\t%d: \u274C %s != %s\n", output, i, actual, expected) - } - } - - } - - if differences == 0 { - return "No differences.", differences - } - - return output, differences - -} - -// Assert compares the arguments with the specified objects and fails if -// they do not exactly match. -func (args Arguments) Assert(t TestingT, objects ...interface{}) bool { - - // get the differences - diff, diffCount := args.Diff(objects) - - if diffCount == 0 { - return true - } - - // there are differences... report them... - t.Logf(diff) - t.Errorf("%sArguments do not match.", assert.CallerInfo()) - - return false - -} - -// String gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -// -// If no index is provided, String() returns a complete string representation -// of the arguments. -func (args Arguments) String(indexOrNil ...int) string { - - if len(indexOrNil) == 0 { - // normal String() method - return a string representation of the args - var argsStr []string - for _, arg := range args { - argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg))) - } - return strings.Join(argsStr, ",") - } else if len(indexOrNil) == 1 { - // Index has been specified - get the argument at that index - var index int = indexOrNil[0] - var s string - var ok bool - if s, ok = args.Get(index).(string); !ok { - panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index))) - } - return s - } - - panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil))) - -} - -// Int gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Int(index int) int { - var s int - var ok bool - if s, ok = args.Get(index).(int); !ok { - panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} - -// Error gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Error(index int) error { - obj := args.Get(index) - var s error - var ok bool - if obj == nil { - return nil - } - if s, ok = obj.(error); !ok { - panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} - -// Bool gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Bool(index int) bool { - var s bool - var ok bool - if s, ok = args.Get(index).(bool); !ok { - panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} diff --git a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock_test.go b/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock_test.go deleted file mode 100644 index a4457e071..000000000 --- a/pkg/api/Godeps/_workspace/src/github.com/stretchr/testify/mock/mock_test.go +++ /dev/null @@ -1,669 +0,0 @@ -package mock - -import ( - "errors" - "github.com/stretchr/testify/assert" - "testing" -) - -/* - Test objects -*/ - -// ExampleInterface represents an example interface. -type ExampleInterface interface { - TheExampleMethod(a, b, c int) (int, error) -} - -// TestExampleImplementation is a test implementation of ExampleInterface -type TestExampleImplementation struct { - Mock -} - -func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) { - args := i.Called(a, b, c) - return args.Int(0), errors.New("Whoops") -} - -func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) { - i.Called(yesorno) -} - -type ExampleType struct{} - -func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error { - args := i.Called(et) - return args.Error(0) -} - -/* - Mock -*/ - -func Test_Mock_TestData(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - if assert.NotNil(t, mockedService.TestData()) { - - mockedService.TestData().Set("something", 123) - assert.Equal(t, 123, mockedService.TestData().Get("something").Data()) - - } - -} - -func Test_Mock_On(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - assert.Equal(t, mockedService.On("TheExampleMethod"), &mockedService.Mock) - assert.Equal(t, "TheExampleMethod", mockedService.onMethodName) - -} - -func Test_Mock_On_WithArgs(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - assert.Equal(t, mockedService.On("TheExampleMethod", 1, 2, 3), &mockedService.Mock) - assert.Equal(t, "TheExampleMethod", mockedService.onMethodName) - assert.Equal(t, 1, mockedService.onMethodArguments[0]) - assert.Equal(t, 2, mockedService.onMethodArguments[1]) - assert.Equal(t, 3, mockedService.onMethodArguments[2]) - -} - -func Test_Mock_Return(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - assert.Equal(t, mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true), &mockedService.Mock) - - // ensure the call was created - if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) { - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 0, call.Repeatability) - - } - -} - -func Test_Mock_Return_Once(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Once() - - // ensure the call was created - if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) { - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 1, call.Repeatability) - - } - -} - -func Test_Mock_Return_Twice(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Twice() - - // ensure the call was created - if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) { - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 2, call.Repeatability) - - } - -} - -func Test_Mock_Return_Times(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Times(5) - - // ensure the call was created - if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) { - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 5, call.Repeatability) - - } - -} - -func Test_Mock_Return_Nothing(t *testing.T) { - - // make a test impl object - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - assert.Equal(t, mockedService.On("TheExampleMethod", "A", "B", true).Return(), &mockedService.Mock) - - // ensure the call was created - if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) { - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 0, len(call.ReturnArguments)) - - } - -} - -func Test_Mock_findExpectedCall(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two") - m.On("Two", 3).Return("three") - - f, c := m.findExpectedCall("Two", 3) - - if assert.Equal(t, 2, f) { - if assert.NotNil(t, c) { - assert.Equal(t, "Two", c.Method) - assert.Equal(t, 3, c.Arguments[0]) - assert.Equal(t, "three", c.ReturnArguments[0]) - } - } - -} - -func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two") - m.On("Two", 3).Return("three") - - f, _ := m.findExpectedCall("Two") - - assert.Equal(t, -1, f) - -} - -func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two").Once() - m.On("Two", 3).Return("three").Twice() - m.On("Two", 3).Return("three").Times(8) - - f, c := m.findExpectedCall("Two", 3) - - if assert.Equal(t, 2, f) { - if assert.NotNil(t, c) { - assert.Equal(t, "Two", c.Method) - assert.Equal(t, 3, c.Arguments[0]) - assert.Equal(t, "three", c.ReturnArguments[0]) - } - } - -} - -func Test_callString(t *testing.T) { - - assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false)) - -} - -func Test_Mock_Called(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true) - - returnArguments := mockedService.Called(1, 2, 3) - - if assert.Equal(t, 1, len(mockedService.Calls)) { - assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method) - assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) - } - - if assert.Equal(t, 3, len(returnArguments)) { - assert.Equal(t, 5, returnArguments[0]) - assert.Equal(t, "6", returnArguments[1]) - assert.Equal(t, true, returnArguments[2]) - } - -} - -func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).Return(5, "6", true).Once() - mockedService.On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).Return(-1, "hi", false) - - returnArguments1 := mockedService.Called(1, 2, 3) - returnArguments2 := mockedService.Called(1, 2, 3) - - if assert.Equal(t, 2, len(mockedService.Calls)) { - assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method) - assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) - - assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method) - assert.Equal(t, 1, mockedService.Calls[1].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[1].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[1].Arguments[2]) - } - - if assert.Equal(t, 3, len(returnArguments1)) { - assert.Equal(t, 5, returnArguments1[0]) - assert.Equal(t, "6", returnArguments1[1]) - assert.Equal(t, true, returnArguments1[2]) - } - - if assert.Equal(t, 3, len(returnArguments2)) { - assert.Equal(t, -1, returnArguments2[0]) - assert.Equal(t, "hi", returnArguments2[1]) - assert.Equal(t, false, returnArguments2[2]) - } - -} - -func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4) - - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - assert.Panics(t, func() { - mockedService.TheExampleMethod(1, 2, 3) - }) - -} - -func Test_Mock_Called_Unexpected(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - // make sure it panics if no expectation was made - assert.Panics(t, func() { - mockedService.Called(1, 2, 3) - }, "Calling unexpected method should panic") - -} - -func Test_AssertExpectationsForObjects_Helper(t *testing.T) { - - var mockedService1 *TestExampleImplementation = new(TestExampleImplementation) - var mockedService2 *TestExampleImplementation = new(TestExampleImplementation) - var mockedService3 *TestExampleImplementation = new(TestExampleImplementation) - - mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return() - mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return() - mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return() - - mockedService1.Called(1) - mockedService2.Called(2) - mockedService3.Called(3) - - assert.True(t, AssertExpectationsForObjects(t, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock)) - -} - -func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) { - - var mockedService1 *TestExampleImplementation = new(TestExampleImplementation) - var mockedService2 *TestExampleImplementation = new(TestExampleImplementation) - var mockedService3 *TestExampleImplementation = new(TestExampleImplementation) - - mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return() - mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return() - mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return() - - mockedService1.Called(1) - mockedService3.Called(3) - - tt := new(testing.T) - assert.False(t, AssertExpectationsForObjects(tt, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock)) - -} - -func Test_Mock_AssertExpectations(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7) - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called(1, 2, 3) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectationsCustomType(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once() - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.TheExampleMethod3(&ExampleType{}) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice() - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called(1, 2, 3) - - assert.False(t, mockedService.AssertExpectations(tt)) - - mockedService.Called(1, 2, 3) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7) - mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7) - - args1 := mockedService.Called(1, 2, 3) - assert.Equal(t, 5, args1.Int(0)) - assert.Equal(t, 6, args1.Int(1)) - assert.Equal(t, 7, args1.Int(2)) - - args2 := mockedService.Called(4, 5, 6) - assert.Equal(t, 5, args2.Int(0)) - assert.Equal(t, 6, args2.Int(1)) - assert.Equal(t, 7, args2.Int(2)) - -} - -func Test_Mock_AssertNumberOfCalls(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1)) - - mockedService.Called(1, 2, 3) - assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2)) - -} - -func Test_Mock_AssertCalled(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3)) - -} - -func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything).Return() - - mockedService.Called(1, "two", []uint8("three")) - - assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8"))) - -} - -func Test_Mock_AssertCalled_WithArguments(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - tt := new(testing.T) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3)) - assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4)) - -} - -func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once() - mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once() - - mockedService.Called(1, 2, 3) - mockedService.Called(2, 3, 4) - - tt := new(testing.T) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3)) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4)) - assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5)) - -} - -func Test_Mock_AssertNotCalled(t *testing.T) { - - var mockedService *TestExampleImplementation = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled")) - -} - -/* - Arguments helper methods -*/ -func Test_Arguments_Get(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - - assert.Equal(t, "string", args.Get(0).(string)) - assert.Equal(t, 123, args.Get(1).(int)) - assert.Equal(t, true, args.Get(2).(bool)) - -} - -func Test_Arguments_Is(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - - assert.True(t, args.Is("string", 123, true)) - assert.False(t, args.Is("wrong", 456, false)) - -} - -func Test_Arguments_Diff(t *testing.T) { - - var args Arguments = []interface{}{"Hello World", 123, true} - var diff string - var count int - diff, count = args.Diff([]interface{}{"Hello World", 456, "false"}) - - assert.Equal(t, 2, count) - assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`) - assert.Contains(t, diff, `false != %!s(bool=true)`) - -} - -func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - var diff string - var count int - diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"}) - - assert.Equal(t, 3, count) - assert.Contains(t, diff, `extra != (Missing)`) - -} - -func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - var count int - _, count = args.Diff([]interface{}{"string", Anything, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) { - - var args Arguments = []interface{}{"string", Anything, true} - var count int - _, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) { - - var args Arguments = []interface{}{"string", AnythingOfType("int"), true} - var count int - _, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) { - - var args Arguments = []interface{}{"string", AnythingOfType("string"), true} - var count int - var diff string - diff, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 1, count) - assert.Contains(t, diff, `string != type int - %!s(int=123)`) - -} - -func Test_Arguments_Assert(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - - assert.True(t, args.Assert(t, "string", 123, true)) - -} - -func Test_Arguments_String_Representation(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - assert.Equal(t, `string,int,bool`, args.String()) - -} - -func Test_Arguments_String(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - assert.Equal(t, "string", args.String(0)) - -} - -func Test_Arguments_Error(t *testing.T) { - - var err error = errors.New("An Error") - var args Arguments = []interface{}{"string", 123, true, err} - assert.Equal(t, err, args.Error(3)) - -} - -func Test_Arguments_Error_Nil(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true, nil} - assert.Equal(t, nil, args.Error(3)) - -} - -func Test_Arguments_Int(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - assert.Equal(t, 123, args.Int(1)) - -} - -func Test_Arguments_Bool(t *testing.T) { - - var args Arguments = []interface{}{"string", 123, true} - assert.Equal(t, true, args.Bool(2)) - -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/.gitignore b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/.gitignore deleted file mode 100644 index 191a5360b..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -_* -*.swp -*.[568] -[568].out diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/LICENSE b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/LICENSE deleted file mode 100644 index 545cf2d33..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Gocheck - A rich testing framework for Go - -Copyright (c) 2010-2013 Gustavo Niemeyer - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/README.md b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/README.md deleted file mode 100644 index 0ca9e5726..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Instructions -============ - -Install the package with: - - go get gopkg.in/check.v1 - -Import it with: - - import "gopkg.in/check.v1" - -and use _check_ as the package name inside the code. - -For more details, visit the project page: - -* http://labix.org/gocheck - -and the API documentation: - -* https://gopkg.in/check.v1 diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/TODO b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/TODO deleted file mode 100644 index 33498270e..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/TODO +++ /dev/null @@ -1,2 +0,0 @@ -- Assert(slice, Contains, item) -- Parallel test support diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark.go deleted file mode 100644 index 48cb8c811..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package check - -import ( - "fmt" - "runtime" - "time" -) - -var memStats runtime.MemStats - -// testingB is a type passed to Benchmark functions to manage benchmark -// timing and to specify the number of iterations to run. -type timer struct { - start time.Time // Time test or benchmark started - duration time.Duration - N int - bytes int64 - timerOn bool - benchTime time.Duration - // The initial states of memStats.Mallocs and memStats.TotalAlloc. - startAllocs uint64 - startBytes uint64 - // The net total of this test after being run. - netAllocs uint64 - netBytes uint64 -} - -// StartTimer starts timing a test. This function is called automatically -// before a benchmark starts, but it can also used to resume timing after -// a call to StopTimer. -func (c *C) StartTimer() { - if !c.timerOn { - c.start = time.Now() - c.timerOn = true - - runtime.ReadMemStats(&memStats) - c.startAllocs = memStats.Mallocs - c.startBytes = memStats.TotalAlloc - } -} - -// StopTimer stops timing a test. This can be used to pause the timer -// while performing complex initialization that you don't -// want to measure. -func (c *C) StopTimer() { - if c.timerOn { - c.duration += time.Now().Sub(c.start) - c.timerOn = false - runtime.ReadMemStats(&memStats) - c.netAllocs += memStats.Mallocs - c.startAllocs - c.netBytes += memStats.TotalAlloc - c.startBytes - } -} - -// ResetTimer sets the elapsed benchmark time to zero. -// It does not affect whether the timer is running. -func (c *C) ResetTimer() { - if c.timerOn { - c.start = time.Now() - runtime.ReadMemStats(&memStats) - c.startAllocs = memStats.Mallocs - c.startBytes = memStats.TotalAlloc - } - c.duration = 0 - c.netAllocs = 0 - c.netBytes = 0 -} - -// SetBytes informs the number of bytes that the benchmark processes -// on each iteration. If this is called in a benchmark it will also -// report MB/s. -func (c *C) SetBytes(n int64) { - c.bytes = n -} - -func (c *C) nsPerOp() int64 { - if c.N <= 0 { - return 0 - } - return c.duration.Nanoseconds() / int64(c.N) -} - -func (c *C) mbPerSec() float64 { - if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 { - return 0 - } - return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds() -} - -func (c *C) timerString() string { - if c.N <= 0 { - return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9) - } - mbs := c.mbPerSec() - mb := "" - if mbs != 0 { - mb = fmt.Sprintf("\t%7.2f MB/s", mbs) - } - nsop := c.nsPerOp() - ns := fmt.Sprintf("%10d ns/op", nsop) - if c.N > 0 && nsop < 100 { - // The format specifiers here make sure that - // the ones digits line up for all three possible formats. - if nsop < 10 { - ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) - } else { - ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) - } - } - memStats := "" - if c.benchMem { - allocedBytes := fmt.Sprintf("%8d B/op", int64(c.netBytes)/int64(c.N)) - allocs := fmt.Sprintf("%8d allocs/op", int64(c.netAllocs)/int64(c.N)) - memStats = fmt.Sprintf("\t%s\t%s", allocedBytes, allocs) - } - return fmt.Sprintf("%8d\t%s%s%s", c.N, ns, mb, memStats) -} - -func min(x, y int) int { - if x > y { - return y - } - return x -} - -func max(x, y int) int { - if x < y { - return y - } - return x -} - -// roundDown10 rounds a number down to the nearest power of 10. -func roundDown10(n int) int { - var tens = 0 - // tens = floor(log_10(n)) - for n > 10 { - n = n / 10 - tens++ - } - // result = 10^tens - result := 1 - for i := 0; i < tens; i++ { - result *= 10 - } - return result -} - -// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. -func roundUp(n int) int { - base := roundDown10(n) - if n < (2 * base) { - return 2 * base - } - if n < (5 * base) { - return 5 * base - } - return 10 * base -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark_test.go deleted file mode 100644 index 4dd827c16..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/benchmark_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// These tests verify the test running logic. - -package check_test - -import ( - "time" - . "gopkg.in/check.v1" -) - -var benchmarkS = Suite(&BenchmarkS{}) - -type BenchmarkS struct{} - -func (s *BenchmarkS) TestCountSuite(c *C) { - suitesRun += 1 -} - -func (s *BenchmarkS) TestBasicTestTiming(c *C) { - helper := FixtureHelper{sleepOn: "Test1", sleep: 1000000 * time.Nanosecond} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t0\\.001s\n" + - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t0\\.000s\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestStreamTestTiming(c *C) { - helper := FixtureHelper{sleepOn: "SetUpSuite", sleep: 1000000 * time.Nanosecond} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(&helper, &runConf) - - expected := "(?s).*\nPASS: check_test\\.go:[0-9]+: FixtureHelper\\.SetUpSuite\t *0\\.001s\n.*" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmark(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkTime: 10000000, - Filter: "Benchmark1", - } - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Benchmark1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Benchmark1") - c.Check(helper.calls[6], Equals, "TearDownTest") - // ... and more. - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark1\t *100\t *[12][0-9]{5} ns/op\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmarkBytes(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkTime: 10000000, - Filter: "Benchmark2", - } - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark2\t *100\t *[12][0-9]{5} ns/op\t *[4-9]\\.[0-9]{2} MB/s\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmarkMem(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkMem: true, - BenchmarkTime: 10000000, - Filter: "Benchmark3", - } - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark3\t *100\t *[12][0-9]{5} ns/op\t *[0-9]+ B/op\t *[1-9] allocs/op\n" - c.Assert(output.value, Matches, expected) -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/bootstrap_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/bootstrap_test.go deleted file mode 100644 index e55f327c7..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/bootstrap_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// These initial tests are for bootstrapping. They verify that we can -// basically use the testing infrastructure itself to check if the test -// system is working. -// -// These tests use will break down the test runner badly in case of -// errors because if they simply fail, we can't be sure the developer -// will ever see anything (because failing means the failing system -// somehow isn't working! :-) -// -// Do not assume *any* internal functionality works as expected besides -// what's actually tested here. - -package check_test - -import ( - "fmt" - "gopkg.in/check.v1" - "strings" -) - -type BootstrapS struct{} - -var boostrapS = check.Suite(&BootstrapS{}) - -func (s *BootstrapS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *BootstrapS) TestFailedAndFail(c *check.C) { - if c.Failed() { - critical("c.Failed() must be false first!") - } - c.Fail() - if !c.Failed() { - critical("c.Fail() didn't put the test in a failed state!") - } - c.Succeed() -} - -func (s *BootstrapS) TestFailedAndSucceed(c *check.C) { - c.Fail() - c.Succeed() - if c.Failed() { - critical("c.Succeed() didn't put the test back in a non-failed state") - } -} - -func (s *BootstrapS) TestLogAndGetTestLog(c *check.C) { - c.Log("Hello there!") - log := c.GetTestLog() - if log != "Hello there!\n" { - critical(fmt.Sprintf("Log() or GetTestLog() is not working! Got: %#v", log)) - } -} - -func (s *BootstrapS) TestLogfAndGetTestLog(c *check.C) { - c.Logf("Hello %v", "there!") - log := c.GetTestLog() - if log != "Hello there!\n" { - critical(fmt.Sprintf("Logf() or GetTestLog() is not working! Got: %#v", log)) - } -} - -func (s *BootstrapS) TestRunShowsErrors(c *check.C) { - output := String{} - check.Run(&FailHelper{}, &check.RunConf{Output: &output}) - if strings.Index(output.value, "Expected failure!") == -1 { - critical(fmt.Sprintf("RunWithWriter() output did not contain the "+ - "expected failure! Got: %#v", - output.value)) - } -} - -func (s *BootstrapS) TestRunDoesntShowSuccesses(c *check.C) { - output := String{} - check.Run(&SuccessHelper{}, &check.RunConf{Output: &output}) - if strings.Index(output.value, "Expected success!") != -1 { - critical(fmt.Sprintf("RunWithWriter() output contained a successful "+ - "test! Got: %#v", - output.value)) - } -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check.go deleted file mode 100644 index ca8c0f92d..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check.go +++ /dev/null @@ -1,945 +0,0 @@ -// Package check is a rich testing extension for Go's testing package. -// -// For details about the project, see: -// -// http://labix.org/gocheck -// -package check - -import ( - "bytes" - "errors" - "fmt" - "io" - "math/rand" - "os" - "path" - "path/filepath" - "reflect" - "regexp" - "runtime" - "strconv" - "strings" - "sync" - "time" -) - -// ----------------------------------------------------------------------- -// Internal type which deals with suite method calling. - -const ( - fixtureKd = iota - testKd -) - -type funcKind int - -const ( - succeededSt = iota - failedSt - skippedSt - panickedSt - fixturePanickedSt - missedSt -) - -type funcStatus int - -// A method value can't reach its own Method structure. -type methodType struct { - reflect.Value - Info reflect.Method -} - -func newMethod(receiver reflect.Value, i int) *methodType { - return &methodType{receiver.Method(i), receiver.Type().Method(i)} -} - -func (method *methodType) PC() uintptr { - return method.Info.Func.Pointer() -} - -func (method *methodType) suiteName() string { - t := method.Info.Type.In(0) - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t.Name() -} - -func (method *methodType) String() string { - return method.suiteName() + "." + method.Info.Name -} - -func (method *methodType) matches(re *regexp.Regexp) bool { - return (re.MatchString(method.Info.Name) || - re.MatchString(method.suiteName()) || - re.MatchString(method.String())) -} - -type C struct { - method *methodType - kind funcKind - testName string - status funcStatus - logb *logger - logw io.Writer - done chan *C - reason string - mustFail bool - tempDir *tempDir - benchMem bool - startTime time.Time - timer -} - -func (c *C) stopNow() { - runtime.Goexit() -} - -// logger is a concurrency safe byte.Buffer -type logger struct { - sync.Mutex - writer bytes.Buffer -} - -func (l *logger) Write(buf []byte) (int, error) { - l.Lock() - defer l.Unlock() - return l.writer.Write(buf) -} - -func (l *logger) WriteTo(w io.Writer) (int64, error) { - l.Lock() - defer l.Unlock() - return l.writer.WriteTo(w) -} - -func (l *logger) String() string { - l.Lock() - defer l.Unlock() - return l.writer.String() -} - -// ----------------------------------------------------------------------- -// Handling of temporary files and directories. - -type tempDir struct { - sync.Mutex - path string - counter int -} - -func (td *tempDir) newPath() string { - td.Lock() - defer td.Unlock() - if td.path == "" { - var err error - for i := 0; i != 100; i++ { - path := fmt.Sprintf("%s%ccheck-%d", os.TempDir(), os.PathSeparator, rand.Int()) - if err = os.Mkdir(path, 0700); err == nil { - td.path = path - break - } - } - if td.path == "" { - panic("Couldn't create temporary directory: " + err.Error()) - } - } - result := filepath.Join(td.path, strconv.Itoa(td.counter)) - td.counter += 1 - return result -} - -func (td *tempDir) removeAll() { - td.Lock() - defer td.Unlock() - if td.path != "" { - err := os.RemoveAll(td.path) - if err != nil { - fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error()) - } - } -} - -// Create a new temporary directory which is automatically removed after -// the suite finishes running. -func (c *C) MkDir() string { - path := c.tempDir.newPath() - if err := os.Mkdir(path, 0700); err != nil { - panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error())) - } - return path -} - -// ----------------------------------------------------------------------- -// Low-level logging functions. - -func (c *C) log(args ...interface{}) { - c.writeLog([]byte(fmt.Sprint(args...) + "\n")) -} - -func (c *C) logf(format string, args ...interface{}) { - c.writeLog([]byte(fmt.Sprintf(format+"\n", args...))) -} - -func (c *C) logNewLine() { - c.writeLog([]byte{'\n'}) -} - -func (c *C) writeLog(buf []byte) { - c.logb.Write(buf) - if c.logw != nil { - c.logw.Write(buf) - } -} - -func hasStringOrError(x interface{}) (ok bool) { - _, ok = x.(fmt.Stringer) - if ok { - return - } - _, ok = x.(error) - return -} - -func (c *C) logValue(label string, value interface{}) { - if label == "" { - if hasStringOrError(value) { - c.logf("... %#v (%q)", value, value) - } else { - c.logf("... %#v", value) - } - } else if value == nil { - c.logf("... %s = nil", label) - } else { - if hasStringOrError(value) { - fv := fmt.Sprintf("%#v", value) - qv := fmt.Sprintf("%q", value) - if fv != qv { - c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv) - return - } - } - if s, ok := value.(string); ok && isMultiLine(s) { - c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value)) - c.logMultiLine(s) - } else { - c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value) - } - } -} - -func (c *C) logMultiLine(s string) { - b := make([]byte, 0, len(s)*2) - i := 0 - n := len(s) - for i < n { - j := i + 1 - for j < n && s[j-1] != '\n' { - j++ - } - b = append(b, "... "...) - b = strconv.AppendQuote(b, s[i:j]) - if j < n { - b = append(b, " +"...) - } - b = append(b, '\n') - i = j - } - c.writeLog(b) -} - -func isMultiLine(s string) bool { - for i := 0; i+1 < len(s); i++ { - if s[i] == '\n' { - return true - } - } - return false -} - -func (c *C) logString(issue string) { - c.log("... ", issue) -} - -func (c *C) logCaller(skip int) { - // This is a bit heavier than it ought to be. - skip += 1 // Our own frame. - pc, callerFile, callerLine, ok := runtime.Caller(skip) - if !ok { - return - } - var testFile string - var testLine int - testFunc := runtime.FuncForPC(c.method.PC()) - if runtime.FuncForPC(pc) != testFunc { - for { - skip += 1 - if pc, file, line, ok := runtime.Caller(skip); ok { - // Note that the test line may be different on - // distinct calls for the same test. Showing - // the "internal" line is helpful when debugging. - if runtime.FuncForPC(pc) == testFunc { - testFile, testLine = file, line - break - } - } else { - break - } - } - } - if testFile != "" && (testFile != callerFile || testLine != callerLine) { - c.logCode(testFile, testLine) - } - c.logCode(callerFile, callerLine) -} - -func (c *C) logCode(path string, line int) { - c.logf("%s:%d:", nicePath(path), line) - code, err := printLine(path, line) - if code == "" { - code = "..." // XXX Open the file and take the raw line. - if err != nil { - code += err.Error() - } - } - c.log(indent(code, " ")) -} - -var valueGo = filepath.Join("reflect", "value.go") -var asmGo = filepath.Join("runtime", "asm_") - -func (c *C) logPanic(skip int, value interface{}) { - skip++ // Our own frame. - initialSkip := skip - for ; ; skip++ { - if pc, file, line, ok := runtime.Caller(skip); ok { - if skip == initialSkip { - c.logf("... Panic: %s (PC=0x%X)\n", value, pc) - } - name := niceFuncName(pc) - path := nicePath(file) - if strings.Contains(path, "/gopkg.in/check.v") { - continue - } - if name == "Value.call" && strings.HasSuffix(path, valueGo) { - continue - } - if name == "call16" && strings.Contains(path, asmGo) { - continue - } - c.logf("%s:%d\n in %s", nicePath(file), line, name) - } else { - break - } - } -} - -func (c *C) logSoftPanic(issue string) { - c.log("... Panic: ", issue) -} - -func (c *C) logArgPanic(method *methodType, expectedType string) { - c.logf("... Panic: %s argument should be %s", - niceFuncName(method.PC()), expectedType) -} - -// ----------------------------------------------------------------------- -// Some simple formatting helpers. - -var initWD, initWDErr = os.Getwd() - -func init() { - if initWDErr == nil { - initWD = strings.Replace(initWD, "\\", "/", -1) + "/" - } -} - -func nicePath(path string) string { - if initWDErr == nil { - if strings.HasPrefix(path, initWD) { - return path[len(initWD):] - } - } - return path -} - -func niceFuncPath(pc uintptr) string { - function := runtime.FuncForPC(pc) - if function != nil { - filename, line := function.FileLine(pc) - return fmt.Sprintf("%s:%d", nicePath(filename), line) - } - return "" -} - -func niceFuncName(pc uintptr) string { - function := runtime.FuncForPC(pc) - if function != nil { - name := path.Base(function.Name()) - if i := strings.Index(name, "."); i > 0 { - name = name[i+1:] - } - if strings.HasPrefix(name, "(*") { - if i := strings.Index(name, ")"); i > 0 { - name = name[2:i] + name[i+1:] - } - } - if i := strings.LastIndex(name, ".*"); i != -1 { - name = name[:i] + "." + name[i+2:] - } - if i := strings.LastIndex(name, "·"); i != -1 { - name = name[:i] + "." + name[i+2:] - } - return name - } - return "" -} - -// ----------------------------------------------------------------------- -// Result tracker to aggregate call results. - -type Result struct { - Succeeded int - Failed int - Skipped int - Panicked int - FixturePanicked int - ExpectedFailures int - Missed int // Not even tried to run, related to a panic in the fixture. - RunError error // Houston, we've got a problem. - WorkDir string // If KeepWorkDir is true -} - -type resultTracker struct { - result Result - _lastWasProblem bool - _waiting int - _missed int - _expectChan chan *C - _doneChan chan *C - _stopChan chan bool -} - -func newResultTracker() *resultTracker { - return &resultTracker{_expectChan: make(chan *C), // Synchronous - _doneChan: make(chan *C, 32), // Asynchronous - _stopChan: make(chan bool)} // Synchronous -} - -func (tracker *resultTracker) start() { - go tracker._loopRoutine() -} - -func (tracker *resultTracker) waitAndStop() { - <-tracker._stopChan -} - -func (tracker *resultTracker) expectCall(c *C) { - tracker._expectChan <- c -} - -func (tracker *resultTracker) callDone(c *C) { - tracker._doneChan <- c -} - -func (tracker *resultTracker) _loopRoutine() { - for { - var c *C - if tracker._waiting > 0 { - // Calls still running. Can't stop. - select { - // XXX Reindent this (not now to make diff clear) - case c = <-tracker._expectChan: - tracker._waiting += 1 - case c = <-tracker._doneChan: - tracker._waiting -= 1 - switch c.status { - case succeededSt: - if c.kind == testKd { - if c.mustFail { - tracker.result.ExpectedFailures++ - } else { - tracker.result.Succeeded++ - } - } - case failedSt: - tracker.result.Failed++ - case panickedSt: - if c.kind == fixtureKd { - tracker.result.FixturePanicked++ - } else { - tracker.result.Panicked++ - } - case fixturePanickedSt: - // Track it as missed, since the panic - // was on the fixture, not on the test. - tracker.result.Missed++ - case missedSt: - tracker.result.Missed++ - case skippedSt: - if c.kind == testKd { - tracker.result.Skipped++ - } - } - } - } else { - // No calls. Can stop, but no done calls here. - select { - case tracker._stopChan <- true: - return - case c = <-tracker._expectChan: - tracker._waiting += 1 - case c = <-tracker._doneChan: - panic("Tracker got an unexpected done call.") - } - } - } -} - -// ----------------------------------------------------------------------- -// The underlying suite runner. - -type suiteRunner struct { - suite interface{} - setUpSuite, tearDownSuite *methodType - setUpTest, tearDownTest *methodType - tests []*methodType - tracker *resultTracker - tempDir *tempDir - keepDir bool - output *outputWriter - reportedProblemLast bool - benchTime time.Duration - benchMem bool -} - -type RunConf struct { - Output io.Writer - Stream bool - Verbose bool - Filter string - Benchmark bool - BenchmarkTime time.Duration // Defaults to 1 second - BenchmarkMem bool - KeepWorkDir bool -} - -// Create a new suiteRunner able to run all methods in the given suite. -func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner { - var conf RunConf - if runConf != nil { - conf = *runConf - } - if conf.Output == nil { - conf.Output = os.Stdout - } - if conf.Benchmark { - conf.Verbose = true - } - - suiteType := reflect.TypeOf(suite) - suiteNumMethods := suiteType.NumMethod() - suiteValue := reflect.ValueOf(suite) - - runner := &suiteRunner{ - suite: suite, - output: newOutputWriter(conf.Output, conf.Stream, conf.Verbose), - tracker: newResultTracker(), - benchTime: conf.BenchmarkTime, - benchMem: conf.BenchmarkMem, - tempDir: &tempDir{}, - keepDir: conf.KeepWorkDir, - tests: make([]*methodType, 0, suiteNumMethods), - } - if runner.benchTime == 0 { - runner.benchTime = 1 * time.Second - } - - var filterRegexp *regexp.Regexp - if conf.Filter != "" { - if regexp, err := regexp.Compile(conf.Filter); err != nil { - msg := "Bad filter expression: " + err.Error() - runner.tracker.result.RunError = errors.New(msg) - return runner - } else { - filterRegexp = regexp - } - } - - for i := 0; i != suiteNumMethods; i++ { - method := newMethod(suiteValue, i) - switch method.Info.Name { - case "SetUpSuite": - runner.setUpSuite = method - case "TearDownSuite": - runner.tearDownSuite = method - case "SetUpTest": - runner.setUpTest = method - case "TearDownTest": - runner.tearDownTest = method - default: - prefix := "Test" - if conf.Benchmark { - prefix = "Benchmark" - } - if !strings.HasPrefix(method.Info.Name, prefix) { - continue - } - if filterRegexp == nil || method.matches(filterRegexp) { - runner.tests = append(runner.tests, method) - } - } - } - return runner -} - -// Run all methods in the given suite. -func (runner *suiteRunner) run() *Result { - if runner.tracker.result.RunError == nil && len(runner.tests) > 0 { - runner.tracker.start() - if runner.checkFixtureArgs() { - c := runner.runFixture(runner.setUpSuite, "", nil) - if c == nil || c.status == succeededSt { - for i := 0; i != len(runner.tests); i++ { - c := runner.runTest(runner.tests[i]) - if c.status == fixturePanickedSt { - runner.skipTests(missedSt, runner.tests[i+1:]) - break - } - } - } else if c != nil && c.status == skippedSt { - runner.skipTests(skippedSt, runner.tests) - } else { - runner.skipTests(missedSt, runner.tests) - } - runner.runFixture(runner.tearDownSuite, "", nil) - } else { - runner.skipTests(missedSt, runner.tests) - } - runner.tracker.waitAndStop() - if runner.keepDir { - runner.tracker.result.WorkDir = runner.tempDir.path - } else { - runner.tempDir.removeAll() - } - } - return &runner.tracker.result -} - -// Create a call object with the given suite method, and fork a -// goroutine with the provided dispatcher for running it. -func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { - var logw io.Writer - if runner.output.Stream { - logw = runner.output - } - if logb == nil { - logb = new(logger) - } - c := &C{ - method: method, - kind: kind, - testName: testName, - logb: logb, - logw: logw, - tempDir: runner.tempDir, - done: make(chan *C, 1), - timer: timer{benchTime: runner.benchTime}, - startTime: time.Now(), - benchMem: runner.benchMem, - } - runner.tracker.expectCall(c) - go (func() { - runner.reportCallStarted(c) - defer runner.callDone(c) - dispatcher(c) - })() - return c -} - -// Same as forkCall(), but wait for call to finish before returning. -func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { - c := runner.forkCall(method, kind, testName, logb, dispatcher) - <-c.done - return c -} - -// Handle a finished call. If there were any panics, update the call status -// accordingly. Then, mark the call as done and report to the tracker. -func (runner *suiteRunner) callDone(c *C) { - value := recover() - if value != nil { - switch v := value.(type) { - case *fixturePanic: - if v.status == skippedSt { - c.status = skippedSt - } else { - c.logSoftPanic("Fixture has panicked (see related PANIC)") - c.status = fixturePanickedSt - } - default: - c.logPanic(1, value) - c.status = panickedSt - } - } - if c.mustFail { - switch c.status { - case failedSt: - c.status = succeededSt - case succeededSt: - c.status = failedSt - c.logString("Error: Test succeeded, but was expected to fail") - c.logString("Reason: " + c.reason) - } - } - - runner.reportCallDone(c) - c.done <- c -} - -// Runs a fixture call synchronously. The fixture will still be run in a -// goroutine like all suite methods, but this method will not return -// while the fixture goroutine is not done, because the fixture must be -// run in a desired order. -func (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C { - if method != nil { - c := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) { - c.ResetTimer() - c.StartTimer() - defer c.StopTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - }) - return c - } - return nil -} - -// Run the fixture method with runFixture(), but panic with a fixturePanic{} -// in case the fixture method panics. This makes it easier to track the -// fixture panic together with other call panics within forkTest(). -func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C { - if skipped != nil && *skipped { - return nil - } - c := runner.runFixture(method, testName, logb) - if c != nil && c.status != succeededSt { - if skipped != nil { - *skipped = c.status == skippedSt - } - panic(&fixturePanic{c.status, method}) - } - return c -} - -type fixturePanic struct { - status funcStatus - method *methodType -} - -// Run the suite test method, together with the test-specific fixture, -// asynchronously. -func (runner *suiteRunner) forkTest(method *methodType) *C { - testName := method.String() - return runner.forkCall(method, testKd, testName, nil, func(c *C) { - var skipped bool - defer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped) - defer c.StopTimer() - benchN := 1 - for { - runner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped) - mt := c.method.Type() - if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) { - // Rather than a plain panic, provide a more helpful message when - // the argument type is incorrect. - c.status = panickedSt - c.logArgPanic(c.method, "*check.C") - return - } - if strings.HasPrefix(c.method.Info.Name, "Test") { - c.ResetTimer() - c.StartTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - return - } - if !strings.HasPrefix(c.method.Info.Name, "Benchmark") { - panic("unexpected method prefix: " + c.method.Info.Name) - } - - runtime.GC() - c.N = benchN - c.ResetTimer() - c.StartTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - c.StopTimer() - if c.status != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 { - return - } - perOpN := int(1e9) - if c.nsPerOp() != 0 { - perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp()) - } - - // Logic taken from the stock testing package: - // - Run more iterations than we think we'll need for a second (1.5x). - // - Don't grow too fast in case we had timing errors previously. - // - Be sure to run at least one more than last time. - benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1) - benchN = roundUp(benchN) - - skipped = true // Don't run the deferred one if this panics. - runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil) - skipped = false - } - }) -} - -// Same as forkTest(), but wait for the test to finish before returning. -func (runner *suiteRunner) runTest(method *methodType) *C { - c := runner.forkTest(method) - <-c.done - return c -} - -// Helper to mark tests as skipped or missed. A bit heavy for what -// it does, but it enables homogeneous handling of tracking, including -// nice verbose output. -func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) { - for _, method := range methods { - runner.runFunc(method, testKd, "", nil, func(c *C) { - c.status = status - }) - } -} - -// Verify if the fixture arguments are *check.C. In case of errors, -// log the error as a panic in the fixture method call, and return false. -func (runner *suiteRunner) checkFixtureArgs() bool { - succeeded := true - argType := reflect.TypeOf(&C{}) - for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} { - if method != nil { - mt := method.Type() - if mt.NumIn() != 1 || mt.In(0) != argType { - succeeded = false - runner.runFunc(method, fixtureKd, "", nil, func(c *C) { - c.logArgPanic(method, "*check.C") - c.status = panickedSt - }) - } - } - } - return succeeded -} - -func (runner *suiteRunner) reportCallStarted(c *C) { - runner.output.WriteCallStarted("START", c) -} - -func (runner *suiteRunner) reportCallDone(c *C) { - runner.tracker.callDone(c) - switch c.status { - case succeededSt: - if c.mustFail { - runner.output.WriteCallSuccess("FAIL EXPECTED", c) - } else { - runner.output.WriteCallSuccess("PASS", c) - } - case skippedSt: - runner.output.WriteCallSuccess("SKIP", c) - case failedSt: - runner.output.WriteCallProblem("FAIL", c) - case panickedSt: - runner.output.WriteCallProblem("PANIC", c) - case fixturePanickedSt: - // That's a testKd call reporting that its fixture - // has panicked. The fixture call which caused the - // panic itself was tracked above. We'll report to - // aid debugging. - runner.output.WriteCallProblem("PANIC", c) - case missedSt: - runner.output.WriteCallSuccess("MISS", c) - } -} - -// ----------------------------------------------------------------------- -// Output writer manages atomic output writing according to settings. - -type outputWriter struct { - m sync.Mutex - writer io.Writer - wroteCallProblemLast bool - Stream bool - Verbose bool -} - -func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter { - return &outputWriter{writer: writer, Stream: stream, Verbose: verbose} -} - -func (ow *outputWriter) Write(content []byte) (n int, err error) { - ow.m.Lock() - n, err = ow.writer.Write(content) - ow.m.Unlock() - return -} - -func (ow *outputWriter) WriteCallStarted(label string, c *C) { - if ow.Stream { - header := renderCallHeader(label, c, "", "\n") - ow.m.Lock() - ow.writer.Write([]byte(header)) - ow.m.Unlock() - } -} - -func (ow *outputWriter) WriteCallProblem(label string, c *C) { - var prefix string - if !ow.Stream { - prefix = "\n-----------------------------------" + - "-----------------------------------\n" - } - header := renderCallHeader(label, c, prefix, "\n\n") - ow.m.Lock() - ow.wroteCallProblemLast = true - ow.writer.Write([]byte(header)) - if !ow.Stream { - c.logb.WriteTo(ow.writer) - } - ow.m.Unlock() -} - -func (ow *outputWriter) WriteCallSuccess(label string, c *C) { - if ow.Stream || (ow.Verbose && c.kind == testKd) { - // TODO Use a buffer here. - var suffix string - if c.reason != "" { - suffix = " (" + c.reason + ")" - } - if c.status == succeededSt { - suffix += "\t" + c.timerString() - } - suffix += "\n" - if ow.Stream { - suffix += "\n" - } - header := renderCallHeader(label, c, "", suffix) - ow.m.Lock() - // Resist temptation of using line as prefix above due to race. - if !ow.Stream && ow.wroteCallProblemLast { - header = "\n-----------------------------------" + - "-----------------------------------\n" + - header - } - ow.wroteCallProblemLast = false - ow.writer.Write([]byte(header)) - ow.m.Unlock() - } -} - -func renderCallHeader(label string, c *C, prefix, suffix string) string { - pc := c.method.PC() - return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc), - niceFuncName(pc), suffix) -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check_test.go deleted file mode 100644 index 871b32527..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/check_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// This file contains just a few generic helpers which are used by the -// other test files. - -package check_test - -import ( - "flag" - "fmt" - "os" - "regexp" - "runtime" - "testing" - "time" - - "gopkg.in/check.v1" -) - -// We count the number of suites run at least to get a vague hint that the -// test suite is behaving as it should. Otherwise a bug introduced at the -// very core of the system could go unperceived. -const suitesRunExpected = 8 - -var suitesRun int = 0 - -func Test(t *testing.T) { - check.TestingT(t) - if suitesRun != suitesRunExpected && flag.Lookup("check.f").Value.String() == "" { - critical(fmt.Sprintf("Expected %d suites to run rather than %d", - suitesRunExpected, suitesRun)) - } -} - -// ----------------------------------------------------------------------- -// Helper functions. - -// Break down badly. This is used in test cases which can't yet assume -// that the fundamental bits are working. -func critical(error string) { - fmt.Fprintln(os.Stderr, "CRITICAL: "+error) - os.Exit(1) -} - -// Return the file line where it's called. -func getMyLine() int { - if _, _, line, ok := runtime.Caller(1); ok { - return line - } - return -1 -} - -// ----------------------------------------------------------------------- -// Helper type implementing a basic io.Writer for testing output. - -// Type implementing the io.Writer interface for analyzing output. -type String struct { - value string -} - -// The only function required by the io.Writer interface. Will append -// written data to the String.value string. -func (s *String) Write(p []byte) (n int, err error) { - s.value += string(p) - return len(p), nil -} - -// Trivial wrapper to test errors happening on a different file -// than the test itself. -func checkEqualWrapper(c *check.C, obtained, expected interface{}) (result bool, line int) { - return c.Check(obtained, check.Equals, expected), getMyLine() -} - -// ----------------------------------------------------------------------- -// Helper suite for testing basic fail behavior. - -type FailHelper struct { - testLine int -} - -func (s *FailHelper) TestLogAndFail(c *check.C) { - s.testLine = getMyLine() - 1 - c.Log("Expected failure!") - c.Fail() -} - -// ----------------------------------------------------------------------- -// Helper suite for testing basic success behavior. - -type SuccessHelper struct{} - -func (s *SuccessHelper) TestLogAndSucceed(c *check.C) { - c.Log("Expected success!") -} - -// ----------------------------------------------------------------------- -// Helper suite for testing ordering and behavior of fixture. - -type FixtureHelper struct { - calls []string - panicOn string - skip bool - skipOnN int - sleepOn string - sleep time.Duration - bytes int64 -} - -func (s *FixtureHelper) trace(name string, c *check.C) { - s.calls = append(s.calls, name) - if name == s.panicOn { - panic(name) - } - if s.sleep > 0 && s.sleepOn == name { - time.Sleep(s.sleep) - } - if s.skip && s.skipOnN == len(s.calls)-1 { - c.Skip("skipOnN == n") - } -} - -func (s *FixtureHelper) SetUpSuite(c *check.C) { - s.trace("SetUpSuite", c) -} - -func (s *FixtureHelper) TearDownSuite(c *check.C) { - s.trace("TearDownSuite", c) -} - -func (s *FixtureHelper) SetUpTest(c *check.C) { - s.trace("SetUpTest", c) -} - -func (s *FixtureHelper) TearDownTest(c *check.C) { - s.trace("TearDownTest", c) -} - -func (s *FixtureHelper) Test1(c *check.C) { - s.trace("Test1", c) -} - -func (s *FixtureHelper) Test2(c *check.C) { - s.trace("Test2", c) -} - -func (s *FixtureHelper) Benchmark1(c *check.C) { - s.trace("Benchmark1", c) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - } -} - -func (s *FixtureHelper) Benchmark2(c *check.C) { - s.trace("Benchmark2", c) - c.SetBytes(1024) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - } -} - -func (s *FixtureHelper) Benchmark3(c *check.C) { - var x []int64 - s.trace("Benchmark3", c) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - x = make([]int64, 5) - _ = x - } -} - -// ----------------------------------------------------------------------- -// Helper which checks the state of the test and ensures that it matches -// the given expectations. Depends on c.Errorf() working, so shouldn't -// be used to test this one function. - -type expectedState struct { - name string - result interface{} - failed bool - log string -} - -// Verify the state of the test. Note that since this also verifies if -// the test is supposed to be in a failed state, no other checks should -// be done in addition to what is being tested. -func checkState(c *check.C, result interface{}, expected *expectedState) { - failed := c.Failed() - c.Succeed() - log := c.GetTestLog() - matched, matchError := regexp.MatchString("^"+expected.log+"$", log) - if matchError != nil { - c.Errorf("Error in matching expression used in testing %s", - expected.name) - } else if !matched { - c.Errorf("%s logged:\n----------\n%s----------\n\nExpected:\n----------\n%s\n----------", - expected.name, log, expected.log) - } - if result != expected.result { - c.Errorf("%s returned %#v rather than %#v", - expected.name, result, expected.result) - } - if failed != expected.failed { - if failed { - c.Errorf("%s has failed when it shouldn't", expected.name) - } else { - c.Errorf("%s has not failed when it should", expected.name) - } - } -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers.go deleted file mode 100644 index bac338729..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers.go +++ /dev/null @@ -1,458 +0,0 @@ -package check - -import ( - "fmt" - "reflect" - "regexp" -) - -// ----------------------------------------------------------------------- -// CommentInterface and Commentf helper, to attach extra information to checks. - -type comment struct { - format string - args []interface{} -} - -// Commentf returns an infomational value to use with Assert or Check calls. -// If the checker test fails, the provided arguments will be passed to -// fmt.Sprintf, and will be presented next to the logged failure. -// -// For example: -// -// c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i)) -// -// Note that if the comment is constant, a better option is to -// simply use a normal comment right above or next to the line, as -// it will also get printed with any errors: -// -// c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123) -// -func Commentf(format string, args ...interface{}) CommentInterface { - return &comment{format, args} -} - -// CommentInterface must be implemented by types that attach extra -// information to failed checks. See the Commentf function for details. -type CommentInterface interface { - CheckCommentString() string -} - -func (c *comment) CheckCommentString() string { - return fmt.Sprintf(c.format, c.args...) -} - -// ----------------------------------------------------------------------- -// The Checker interface. - -// The Checker interface must be provided by checkers used with -// the Assert and Check verification methods. -type Checker interface { - Info() *CheckerInfo - Check(params []interface{}, names []string) (result bool, error string) -} - -// See the Checker interface. -type CheckerInfo struct { - Name string - Params []string -} - -func (info *CheckerInfo) Info() *CheckerInfo { - return info -} - -// ----------------------------------------------------------------------- -// Not checker logic inverter. - -// The Not checker inverts the logic of the provided checker. The -// resulting checker will succeed where the original one failed, and -// vice-versa. -// -// For example: -// -// c.Assert(a, Not(Equals), b) -// -func Not(checker Checker) Checker { - return ¬Checker{checker} -} - -type notChecker struct { - sub Checker -} - -func (checker *notChecker) Info() *CheckerInfo { - info := *checker.sub.Info() - info.Name = "Not(" + info.Name + ")" - return &info -} - -func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) { - result, error = checker.sub.Check(params, names) - result = !result - return -} - -// ----------------------------------------------------------------------- -// IsNil checker. - -type isNilChecker struct { - *CheckerInfo -} - -// The IsNil checker tests whether the obtained value is nil. -// -// For example: -// -// c.Assert(err, IsNil) -// -var IsNil Checker = &isNilChecker{ - &CheckerInfo{Name: "IsNil", Params: []string{"value"}}, -} - -func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) { - return isNil(params[0]), "" -} - -func isNil(obtained interface{}) (result bool) { - if obtained == nil { - result = true - } else { - switch v := reflect.ValueOf(obtained); v.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - } - return -} - -// ----------------------------------------------------------------------- -// NotNil checker. Alias for Not(IsNil), since it's so common. - -type notNilChecker struct { - *CheckerInfo -} - -// The NotNil checker verifies that the obtained value is not nil. -// -// For example: -// -// c.Assert(iface, NotNil) -// -// This is an alias for Not(IsNil), made available since it's a -// fairly common check. -// -var NotNil Checker = ¬NilChecker{ - &CheckerInfo{Name: "NotNil", Params: []string{"value"}}, -} - -func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) { - return !isNil(params[0]), "" -} - -// ----------------------------------------------------------------------- -// Equals checker. - -type equalsChecker struct { - *CheckerInfo -} - -// The Equals checker verifies that the obtained value is equal to -// the expected value, according to usual Go semantics for ==. -// -// For example: -// -// c.Assert(value, Equals, 42) -// -var Equals Checker = &equalsChecker{ - &CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}}, -} - -func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) { - defer func() { - if v := recover(); v != nil { - result = false - error = fmt.Sprint(v) - } - }() - return params[0] == params[1], "" -} - -// ----------------------------------------------------------------------- -// DeepEquals checker. - -type deepEqualsChecker struct { - *CheckerInfo -} - -// The DeepEquals checker verifies that the obtained value is deep-equal to -// the expected value. The check will work correctly even when facing -// slices, interfaces, and values of different types (which always fail -// the test). -// -// For example: -// -// c.Assert(value, DeepEquals, 42) -// c.Assert(array, DeepEquals, []string{"hi", "there"}) -// -var DeepEquals Checker = &deepEqualsChecker{ - &CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}}, -} - -func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) { - return reflect.DeepEqual(params[0], params[1]), "" -} - -// ----------------------------------------------------------------------- -// HasLen checker. - -type hasLenChecker struct { - *CheckerInfo -} - -// The HasLen checker verifies that the obtained value has the -// provided length. In many cases this is superior to using Equals -// in conjuction with the len function because in case the check -// fails the value itself will be printed, instead of its length, -// providing more details for figuring the problem. -// -// For example: -// -// c.Assert(list, HasLen, 5) -// -var HasLen Checker = &hasLenChecker{ - &CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}}, -} - -func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) { - n, ok := params[1].(int) - if !ok { - return false, "n must be an int" - } - value := reflect.ValueOf(params[0]) - switch value.Kind() { - case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String: - default: - return false, "obtained value type has no length" - } - return value.Len() == n, "" -} - -// ----------------------------------------------------------------------- -// ErrorMatches checker. - -type errorMatchesChecker struct { - *CheckerInfo -} - -// The ErrorMatches checker verifies that the error value -// is non nil and matches the regular expression provided. -// -// For example: -// -// c.Assert(err, ErrorMatches, "perm.*denied") -// -var ErrorMatches Checker = errorMatchesChecker{ - &CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}}, -} - -func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) { - if params[0] == nil { - return false, "Error value is nil" - } - err, ok := params[0].(error) - if !ok { - return false, "Value is not an error" - } - params[0] = err.Error() - names[0] = "error" - return matches(params[0], params[1]) -} - -// ----------------------------------------------------------------------- -// Matches checker. - -type matchesChecker struct { - *CheckerInfo -} - -// The Matches checker verifies that the string provided as the obtained -// value (or the string resulting from obtained.String()) matches the -// regular expression provided. -// -// For example: -// -// c.Assert(err, Matches, "perm.*denied") -// -var Matches Checker = &matchesChecker{ - &CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}}, -} - -func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) { - return matches(params[0], params[1]) -} - -func matches(value, regex interface{}) (result bool, error string) { - reStr, ok := regex.(string) - if !ok { - return false, "Regex must be a string" - } - valueStr, valueIsStr := value.(string) - if !valueIsStr { - if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr { - valueStr, valueIsStr = valueWithStr.String(), true - } - } - if valueIsStr { - matches, err := regexp.MatchString("^"+reStr+"$", valueStr) - if err != nil { - return false, "Can't compile regex: " + err.Error() - } - return matches, "" - } - return false, "Obtained value is not a string and has no .String()" -} - -// ----------------------------------------------------------------------- -// Panics checker. - -type panicsChecker struct { - *CheckerInfo -} - -// The Panics checker verifies that calling the provided zero-argument -// function will cause a panic which is deep-equal to the provided value. -// -// For example: -// -// c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}). -// -// -var Panics Checker = &panicsChecker{ - &CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}}, -} - -func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) { - f := reflect.ValueOf(params[0]) - if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { - return false, "Function must take zero arguments" - } - defer func() { - // If the function has not panicked, then don't do the check. - if error != "" { - return - } - params[0] = recover() - names[0] = "panic" - result = reflect.DeepEqual(params[0], params[1]) - }() - f.Call(nil) - return false, "Function has not panicked" -} - -type panicMatchesChecker struct { - *CheckerInfo -} - -// The PanicMatches checker verifies that calling the provided zero-argument -// function will cause a panic with an error value matching -// the regular expression provided. -// -// For example: -// -// c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`). -// -// -var PanicMatches Checker = &panicMatchesChecker{ - &CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}}, -} - -func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) { - f := reflect.ValueOf(params[0]) - if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { - return false, "Function must take zero arguments" - } - defer func() { - // If the function has not panicked, then don't do the check. - if errmsg != "" { - return - } - obtained := recover() - names[0] = "panic" - if e, ok := obtained.(error); ok { - params[0] = e.Error() - } else if _, ok := obtained.(string); ok { - params[0] = obtained - } else { - errmsg = "Panic value is not a string or an error" - return - } - result, errmsg = matches(params[0], params[1]) - }() - f.Call(nil) - return false, "Function has not panicked" -} - -// ----------------------------------------------------------------------- -// FitsTypeOf checker. - -type fitsTypeChecker struct { - *CheckerInfo -} - -// The FitsTypeOf checker verifies that the obtained value is -// assignable to a variable with the same type as the provided -// sample value. -// -// For example: -// -// c.Assert(value, FitsTypeOf, int64(0)) -// c.Assert(value, FitsTypeOf, os.Error(nil)) -// -var FitsTypeOf Checker = &fitsTypeChecker{ - &CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}}, -} - -func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) { - obtained := reflect.ValueOf(params[0]) - sample := reflect.ValueOf(params[1]) - if !obtained.IsValid() { - return false, "" - } - if !sample.IsValid() { - return false, "Invalid sample value" - } - return obtained.Type().AssignableTo(sample.Type()), "" -} - -// ----------------------------------------------------------------------- -// Implements checker. - -type implementsChecker struct { - *CheckerInfo -} - -// The Implements checker verifies that the obtained value -// implements the interface specified via a pointer to an interface -// variable. -// -// For example: -// -// var e os.Error -// c.Assert(err, Implements, &e) -// -var Implements Checker = &implementsChecker{ - &CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}}, -} - -func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) { - obtained := reflect.ValueOf(params[0]) - ifaceptr := reflect.ValueOf(params[1]) - if !obtained.IsValid() { - return false, "" - } - if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface { - return false, "ifaceptr should be a pointer to an interface variable" - } - return obtained.Type().Implements(ifaceptr.Elem().Type()), "" -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers_test.go deleted file mode 100644 index 5c6974746..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/checkers_test.go +++ /dev/null @@ -1,272 +0,0 @@ -package check_test - -import ( - "errors" - "gopkg.in/check.v1" - "reflect" - "runtime" -) - -type CheckersS struct{} - -var _ = check.Suite(&CheckersS{}) - -func testInfo(c *check.C, checker check.Checker, name string, paramNames []string) { - info := checker.Info() - if info.Name != name { - c.Fatalf("Got name %s, expected %s", info.Name, name) - } - if !reflect.DeepEqual(info.Params, paramNames) { - c.Fatalf("Got param names %#v, expected %#v", info.Params, paramNames) - } -} - -func testCheck(c *check.C, checker check.Checker, result bool, error string, params ...interface{}) ([]interface{}, []string) { - info := checker.Info() - if len(params) != len(info.Params) { - c.Fatalf("unexpected param count in test; expected %d got %d", len(info.Params), len(params)) - } - names := append([]string{}, info.Params...) - result_, error_ := checker.Check(params, names) - if result_ != result || error_ != error { - c.Fatalf("%s.Check(%#v) returned (%#v, %#v) rather than (%#v, %#v)", - info.Name, params, result_, error_, result, error) - } - return params, names -} - -func (s *CheckersS) TestComment(c *check.C) { - bug := check.Commentf("a %d bc", 42) - comment := bug.CheckCommentString() - if comment != "a 42 bc" { - c.Fatalf("Commentf returned %#v", comment) - } -} - -func (s *CheckersS) TestIsNil(c *check.C) { - testInfo(c, check.IsNil, "IsNil", []string{"value"}) - - testCheck(c, check.IsNil, true, "", nil) - testCheck(c, check.IsNil, false, "", "a") - - testCheck(c, check.IsNil, true, "", (chan int)(nil)) - testCheck(c, check.IsNil, false, "", make(chan int)) - testCheck(c, check.IsNil, true, "", (error)(nil)) - testCheck(c, check.IsNil, false, "", errors.New("")) - testCheck(c, check.IsNil, true, "", ([]int)(nil)) - testCheck(c, check.IsNil, false, "", make([]int, 1)) - testCheck(c, check.IsNil, false, "", int(0)) -} - -func (s *CheckersS) TestNotNil(c *check.C) { - testInfo(c, check.NotNil, "NotNil", []string{"value"}) - - testCheck(c, check.NotNil, false, "", nil) - testCheck(c, check.NotNil, true, "", "a") - - testCheck(c, check.NotNil, false, "", (chan int)(nil)) - testCheck(c, check.NotNil, true, "", make(chan int)) - testCheck(c, check.NotNil, false, "", (error)(nil)) - testCheck(c, check.NotNil, true, "", errors.New("")) - testCheck(c, check.NotNil, false, "", ([]int)(nil)) - testCheck(c, check.NotNil, true, "", make([]int, 1)) -} - -func (s *CheckersS) TestNot(c *check.C) { - testInfo(c, check.Not(check.IsNil), "Not(IsNil)", []string{"value"}) - - testCheck(c, check.Not(check.IsNil), false, "", nil) - testCheck(c, check.Not(check.IsNil), true, "", "a") -} - -type simpleStruct struct { - i int -} - -func (s *CheckersS) TestEquals(c *check.C) { - testInfo(c, check.Equals, "Equals", []string{"obtained", "expected"}) - - // The simplest. - testCheck(c, check.Equals, true, "", 42, 42) - testCheck(c, check.Equals, false, "", 42, 43) - - // Different native types. - testCheck(c, check.Equals, false, "", int32(42), int64(42)) - - // With nil. - testCheck(c, check.Equals, false, "", 42, nil) - - // Slices - testCheck(c, check.Equals, false, "runtime error: comparing uncomparable type []uint8", []byte{1, 2}, []byte{1, 2}) - - // Struct values - testCheck(c, check.Equals, true, "", simpleStruct{1}, simpleStruct{1}) - testCheck(c, check.Equals, false, "", simpleStruct{1}, simpleStruct{2}) - - // Struct pointers - testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{1}) - testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{2}) -} - -func (s *CheckersS) TestDeepEquals(c *check.C) { - testInfo(c, check.DeepEquals, "DeepEquals", []string{"obtained", "expected"}) - - // The simplest. - testCheck(c, check.DeepEquals, true, "", 42, 42) - testCheck(c, check.DeepEquals, false, "", 42, 43) - - // Different native types. - testCheck(c, check.DeepEquals, false, "", int32(42), int64(42)) - - // With nil. - testCheck(c, check.DeepEquals, false, "", 42, nil) - - // Slices - testCheck(c, check.DeepEquals, true, "", []byte{1, 2}, []byte{1, 2}) - testCheck(c, check.DeepEquals, false, "", []byte{1, 2}, []byte{1, 3}) - - // Struct values - testCheck(c, check.DeepEquals, true, "", simpleStruct{1}, simpleStruct{1}) - testCheck(c, check.DeepEquals, false, "", simpleStruct{1}, simpleStruct{2}) - - // Struct pointers - testCheck(c, check.DeepEquals, true, "", &simpleStruct{1}, &simpleStruct{1}) - testCheck(c, check.DeepEquals, false, "", &simpleStruct{1}, &simpleStruct{2}) -} - -func (s *CheckersS) TestHasLen(c *check.C) { - testInfo(c, check.HasLen, "HasLen", []string{"obtained", "n"}) - - testCheck(c, check.HasLen, true, "", "abcd", 4) - testCheck(c, check.HasLen, true, "", []int{1, 2}, 2) - testCheck(c, check.HasLen, false, "", []int{1, 2}, 3) - - testCheck(c, check.HasLen, false, "n must be an int", []int{1, 2}, "2") - testCheck(c, check.HasLen, false, "obtained value type has no length", nil, 2) -} - -func (s *CheckersS) TestErrorMatches(c *check.C) { - testInfo(c, check.ErrorMatches, "ErrorMatches", []string{"value", "regex"}) - - testCheck(c, check.ErrorMatches, false, "Error value is nil", nil, "some error") - testCheck(c, check.ErrorMatches, false, "Value is not an error", 1, "some error") - testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "some error") - testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "so.*or") - - // Verify params mutation - params, names := testCheck(c, check.ErrorMatches, false, "", errors.New("some error"), "other error") - c.Assert(params[0], check.Equals, "some error") - c.Assert(names[0], check.Equals, "error") -} - -func (s *CheckersS) TestMatches(c *check.C) { - testInfo(c, check.Matches, "Matches", []string{"value", "regex"}) - - // Simple matching - testCheck(c, check.Matches, true, "", "abc", "abc") - testCheck(c, check.Matches, true, "", "abc", "a.c") - - // Must match fully - testCheck(c, check.Matches, false, "", "abc", "ab") - testCheck(c, check.Matches, false, "", "abc", "bc") - - // String()-enabled values accepted - testCheck(c, check.Matches, true, "", reflect.ValueOf("abc"), "a.c") - testCheck(c, check.Matches, false, "", reflect.ValueOf("abc"), "a.d") - - // Some error conditions. - testCheck(c, check.Matches, false, "Obtained value is not a string and has no .String()", 1, "a.c") - testCheck(c, check.Matches, false, "Can't compile regex: error parsing regexp: missing closing ]: `[c$`", "abc", "a[c") -} - -func (s *CheckersS) TestPanics(c *check.C) { - testInfo(c, check.Panics, "Panics", []string{"function", "expected"}) - - // Some errors. - testCheck(c, check.Panics, false, "Function has not panicked", func() bool { return false }, "BOOM") - testCheck(c, check.Panics, false, "Function must take zero arguments", 1, "BOOM") - - // Plain strings. - testCheck(c, check.Panics, true, "", func() { panic("BOOM") }, "BOOM") - testCheck(c, check.Panics, false, "", func() { panic("KABOOM") }, "BOOM") - testCheck(c, check.Panics, true, "", func() bool { panic("BOOM") }, "BOOM") - - // Error values. - testCheck(c, check.Panics, true, "", func() { panic(errors.New("BOOM")) }, errors.New("BOOM")) - testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) - - type deep struct{ i int } - // Deep value - testCheck(c, check.Panics, true, "", func() { panic(&deep{99}) }, &deep{99}) - - // Verify params/names mutation - params, names := testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) - c.Assert(params[0], check.ErrorMatches, "KABOOM") - c.Assert(names[0], check.Equals, "panic") - - // Verify a nil panic - testCheck(c, check.Panics, true, "", func() { panic(nil) }, nil) - testCheck(c, check.Panics, false, "", func() { panic(nil) }, "NOPE") -} - -func (s *CheckersS) TestPanicMatches(c *check.C) { - testInfo(c, check.PanicMatches, "PanicMatches", []string{"function", "expected"}) - - // Error matching. - testCheck(c, check.PanicMatches, true, "", func() { panic(errors.New("BOOM")) }, "BO.M") - testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BO.M") - - // Some errors. - testCheck(c, check.PanicMatches, false, "Function has not panicked", func() bool { return false }, "BOOM") - testCheck(c, check.PanicMatches, false, "Function must take zero arguments", 1, "BOOM") - - // Plain strings. - testCheck(c, check.PanicMatches, true, "", func() { panic("BOOM") }, "BO.M") - testCheck(c, check.PanicMatches, false, "", func() { panic("KABOOM") }, "BOOM") - testCheck(c, check.PanicMatches, true, "", func() bool { panic("BOOM") }, "BO.M") - - // Verify params/names mutation - params, names := testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BOOM") - c.Assert(params[0], check.Equals, "KABOOM") - c.Assert(names[0], check.Equals, "panic") - - // Verify a nil panic - testCheck(c, check.PanicMatches, false, "Panic value is not a string or an error", func() { panic(nil) }, "") -} - -func (s *CheckersS) TestFitsTypeOf(c *check.C) { - testInfo(c, check.FitsTypeOf, "FitsTypeOf", []string{"obtained", "sample"}) - - // Basic types - testCheck(c, check.FitsTypeOf, true, "", 1, 0) - testCheck(c, check.FitsTypeOf, false, "", 1, int64(0)) - - // Aliases - testCheck(c, check.FitsTypeOf, false, "", 1, errors.New("")) - testCheck(c, check.FitsTypeOf, false, "", "error", errors.New("")) - testCheck(c, check.FitsTypeOf, true, "", errors.New("error"), errors.New("")) - - // Structures - testCheck(c, check.FitsTypeOf, false, "", 1, simpleStruct{}) - testCheck(c, check.FitsTypeOf, false, "", simpleStruct{42}, &simpleStruct{}) - testCheck(c, check.FitsTypeOf, true, "", simpleStruct{42}, simpleStruct{}) - testCheck(c, check.FitsTypeOf, true, "", &simpleStruct{42}, &simpleStruct{}) - - // Some bad values - testCheck(c, check.FitsTypeOf, false, "Invalid sample value", 1, interface{}(nil)) - testCheck(c, check.FitsTypeOf, false, "", interface{}(nil), 0) -} - -func (s *CheckersS) TestImplements(c *check.C) { - testInfo(c, check.Implements, "Implements", []string{"obtained", "ifaceptr"}) - - var e error - var re runtime.Error - testCheck(c, check.Implements, true, "", errors.New(""), &e) - testCheck(c, check.Implements, false, "", errors.New(""), &re) - - // Some bad values - testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, errors.New("")) - testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, interface{}(nil)) - testCheck(c, check.Implements, false, "", interface{}(nil), &e) -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/export_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/export_test.go deleted file mode 100644 index 0e6cfe0f2..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/export_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package check - -func PrintLine(filename string, line int) (string, error) { - return printLine(filename, line) -} - -func Indent(s, with string) string { - return indent(s, with) -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/fixture_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/fixture_test.go deleted file mode 100644 index 2bff9e163..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/fixture_test.go +++ /dev/null @@ -1,484 +0,0 @@ -// Tests for the behavior of the test fixture system. - -package check_test - -import ( - . "gopkg.in/check.v1" -) - -// ----------------------------------------------------------------------- -// Fixture test suite. - -type FixtureS struct{} - -var fixtureS = Suite(&FixtureS{}) - -func (s *FixtureS) TestCountSuite(c *C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Basic fixture ordering verification. - -func (s *FixtureS) TestOrder(c *C) { - helper := FixtureHelper{} - Run(&helper, nil) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -// ----------------------------------------------------------------------- -// Check the behavior when panics occur within tests and fixtures. - -func (s *FixtureS) TestPanicOnTest(c *C) { - helper := FixtureHelper{panicOn: "Test1"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: FixtureHelper.Test1\n\n" + - "\\.\\.\\. Panic: Test1 \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.Test1\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnSetUpTest(c *C) { - helper := FixtureHelper{panicOn: "SetUpTest"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 4) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: SetUpTest \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.SetUpTest\n" + - "(.|\n)*" + - "\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: Fixture has panicked " + - "\\(see related PANIC\\)\n$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnTearDownTest(c *C) { - helper := FixtureHelper{panicOn: "TearDownTest"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.TearDownTest\n\n" + - "\\.\\.\\. Panic: TearDownTest \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.TearDownTest\n" + - "(.|\n)*" + - "\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: Fixture has panicked " + - "\\(see related PANIC\\)\n$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnSetUpSuite(c *C) { - helper := FixtureHelper{panicOn: "SetUpSuite"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 2) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.SetUpSuite\n\n" + - "\\.\\.\\. Panic: SetUpSuite \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.SetUpSuite\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnTearDownSuite(c *C) { - helper := FixtureHelper{panicOn: "TearDownSuite"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.TearDownSuite\n\n" + - "\\.\\.\\. Panic: TearDownSuite \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.TearDownSuite\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// A wrong argument on a test or fixture will produce a nice error. - -func (s *FixtureS) TestPanicOnWrongTestArg(c *C) { - helper := WrongTestArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "SetUpTest") - c.Check(helper.calls[4], Equals, "Test2") - c.Check(helper.calls[5], Equals, "TearDownTest") - c.Check(helper.calls[6], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 7) - - expected := "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongTestArgHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: WrongTestArgHelper\\.Test1 argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpTestArg(c *C) { - helper := WrongSetUpTestArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpTestArgHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: WrongSetUpTestArgHelper\\.SetUpTest argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpSuiteArg(c *C) { - helper := WrongSetUpSuiteArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpSuiteArgHelper\\.SetUpSuite\n\n" + - "\\.\\.\\. Panic: WrongSetUpSuiteArgHelper\\.SetUpSuite argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Nice errors also when tests or fixture have wrong arg count. - -func (s *FixtureS) TestPanicOnWrongTestArgCount(c *C) { - helper := WrongTestArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "SetUpTest") - c.Check(helper.calls[4], Equals, "Test2") - c.Check(helper.calls[5], Equals, "TearDownTest") - c.Check(helper.calls[6], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 7) - - expected := "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongTestArgCountHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: WrongTestArgCountHelper\\.Test1 argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpTestArgCount(c *C) { - helper := WrongSetUpTestArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpTestArgCountHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: WrongSetUpTestArgCountHelper\\.SetUpTest argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpSuiteArgCount(c *C) { - helper := WrongSetUpSuiteArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpSuiteArgCountHelper\\.SetUpSuite\n\n" + - "\\.\\.\\. Panic: WrongSetUpSuiteArgCountHelper" + - "\\.SetUpSuite argument should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Helper test suites with wrong function arguments. - -type WrongTestArgHelper struct { - FixtureHelper -} - -func (s *WrongTestArgHelper) Test1(t int) { -} - -type WrongSetUpTestArgHelper struct { - FixtureHelper -} - -func (s *WrongSetUpTestArgHelper) SetUpTest(t int) { -} - -type WrongSetUpSuiteArgHelper struct { - FixtureHelper -} - -func (s *WrongSetUpSuiteArgHelper) SetUpSuite(t int) { -} - -type WrongTestArgCountHelper struct { - FixtureHelper -} - -func (s *WrongTestArgCountHelper) Test1(c *C, i int) { -} - -type WrongSetUpTestArgCountHelper struct { - FixtureHelper -} - -func (s *WrongSetUpTestArgCountHelper) SetUpTest(c *C, i int) { -} - -type WrongSetUpSuiteArgCountHelper struct { - FixtureHelper -} - -func (s *WrongSetUpSuiteArgCountHelper) SetUpSuite(c *C, i int) { -} - -// ----------------------------------------------------------------------- -// Ensure fixture doesn't run without tests. - -type NoTestsHelper struct { - hasRun bool -} - -func (s *NoTestsHelper) SetUpSuite(c *C) { - s.hasRun = true -} - -func (s *NoTestsHelper) TearDownSuite(c *C) { - s.hasRun = true -} - -func (s *FixtureS) TestFixtureDoesntRunWithoutTests(c *C) { - helper := NoTestsHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.hasRun, Equals, false) -} - -// ----------------------------------------------------------------------- -// Verify that checks and assertions work correctly inside the fixture. - -type FixtureCheckHelper struct { - fail string - completed bool -} - -func (s *FixtureCheckHelper) SetUpSuite(c *C) { - switch s.fail { - case "SetUpSuiteAssert": - c.Assert(false, Equals, true) - case "SetUpSuiteCheck": - c.Check(false, Equals, true) - } - s.completed = true -} - -func (s *FixtureCheckHelper) SetUpTest(c *C) { - switch s.fail { - case "SetUpTestAssert": - c.Assert(false, Equals, true) - case "SetUpTestCheck": - c.Check(false, Equals, true) - } - s.completed = true -} - -func (s *FixtureCheckHelper) Test(c *C) { - // Do nothing. -} - -func (s *FixtureS) TestSetUpSuiteCheck(c *C) { - helper := FixtureCheckHelper{fail: "SetUpSuiteCheck"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureCheckHelper\\.SetUpSuite\n\n"+ - "fixture_test\\.go:[0-9]+:\n"+ - " c\\.Check\\(false, Equals, true\\)\n"+ - "\\.+ obtained bool = false\n"+ - "\\.+ expected bool = true\n\n") - c.Assert(helper.completed, Equals, true) -} - -func (s *FixtureS) TestSetUpSuiteAssert(c *C) { - helper := FixtureCheckHelper{fail: "SetUpSuiteAssert"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureCheckHelper\\.SetUpSuite\n\n"+ - "fixture_test\\.go:[0-9]+:\n"+ - " c\\.Assert\\(false, Equals, true\\)\n"+ - "\\.+ obtained bool = false\n"+ - "\\.+ expected bool = true\n\n") - c.Assert(helper.completed, Equals, false) -} - -// ----------------------------------------------------------------------- -// Verify that logging within SetUpTest() persists within the test log itself. - -type FixtureLogHelper struct { - c *C -} - -func (s *FixtureLogHelper) SetUpTest(c *C) { - s.c = c - c.Log("1") -} - -func (s *FixtureLogHelper) Test(c *C) { - c.Log("2") - s.c.Log("3") - c.Log("4") - c.Fail() -} - -func (s *FixtureLogHelper) TearDownTest(c *C) { - s.c.Log("5") -} - -func (s *FixtureS) TestFixtureLogging(c *C) { - helper := FixtureLogHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureLogHelper\\.Test\n\n"+ - "1\n2\n3\n4\n5\n") -} - -// ----------------------------------------------------------------------- -// Skip() within fixture methods. - -func (s *FixtureS) TestSkipSuite(c *C) { - helper := FixtureHelper{skip: true, skipOnN: 0} - output := String{} - result := Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Equals, "") - c.Assert(helper.calls[0], Equals, "SetUpSuite") - c.Assert(helper.calls[1], Equals, "TearDownSuite") - c.Assert(len(helper.calls), Equals, 2) - c.Assert(result.Skipped, Equals, 2) -} - -func (s *FixtureS) TestSkipTest(c *C) { - helper := FixtureHelper{skip: true, skipOnN: 1} - output := String{} - result := Run(&helper, &RunConf{Output: &output}) - c.Assert(helper.calls[0], Equals, "SetUpSuite") - c.Assert(helper.calls[1], Equals, "SetUpTest") - c.Assert(helper.calls[2], Equals, "SetUpTest") - c.Assert(helper.calls[3], Equals, "Test2") - c.Assert(helper.calls[4], Equals, "TearDownTest") - c.Assert(helper.calls[5], Equals, "TearDownSuite") - c.Assert(len(helper.calls), Equals, 6) - c.Assert(result.Skipped, Equals, 1) -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/foundation_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/foundation_test.go deleted file mode 100644 index 8ecf7915f..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/foundation_test.go +++ /dev/null @@ -1,335 +0,0 @@ -// These tests check that the foundations of gocheck are working properly. -// They already assume that fundamental failing is working already, though, -// since this was tested in bootstrap_test.go. Even then, some care may -// still have to be taken when using external functions, since they should -// of course not rely on functionality tested here. - -package check_test - -import ( - "fmt" - "gopkg.in/check.v1" - "log" - "os" - "regexp" - "strings" -) - -// ----------------------------------------------------------------------- -// Foundation test suite. - -type FoundationS struct{} - -var foundationS = check.Suite(&FoundationS{}) - -func (s *FoundationS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *FoundationS) TestErrorf(c *check.C) { - // Do not use checkState() here. It depends on Errorf() working. - expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Errorf(\"Error %%v!\", \"message\")\n"+ - "... Error: Error message!\n\n", - getMyLine()+1) - c.Errorf("Error %v!", "message") - failed := c.Failed() - c.Succeed() - if log := c.GetTestLog(); log != expectedLog { - c.Logf("Errorf() logged %#v rather than %#v", log, expectedLog) - c.Fail() - } - if !failed { - c.Logf("Errorf() didn't put the test in a failed state") - c.Fail() - } -} - -func (s *FoundationS) TestError(c *check.C) { - expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c\\.Error\\(\"Error \", \"message!\"\\)\n"+ - "\\.\\.\\. Error: Error message!\n\n", - getMyLine()+1) - c.Error("Error ", "message!") - checkState(c, nil, - &expectedState{ - name: "Error(`Error `, `message!`)", - failed: true, - log: expectedLog, - }) -} - -func (s *FoundationS) TestFailNow(c *check.C) { - defer (func() { - if !c.Failed() { - c.Error("FailNow() didn't fail the test") - } else { - c.Succeed() - if c.GetTestLog() != "" { - c.Error("Something got logged:\n" + c.GetTestLog()) - } - } - })() - - c.FailNow() - c.Log("FailNow() didn't stop the test") -} - -func (s *FoundationS) TestSucceedNow(c *check.C) { - defer (func() { - if c.Failed() { - c.Error("SucceedNow() didn't succeed the test") - } - if c.GetTestLog() != "" { - c.Error("Something got logged:\n" + c.GetTestLog()) - } - })() - - c.Fail() - c.SucceedNow() - c.Log("SucceedNow() didn't stop the test") -} - -func (s *FoundationS) TestFailureHeader(c *check.C) { - output := String{} - failHelper := FailHelper{} - check.Run(&failHelper, &check.RunConf{Output: &output}) - header := fmt.Sprintf(""+ - "\n-----------------------------------"+ - "-----------------------------------\n"+ - "FAIL: check_test.go:%d: FailHelper.TestLogAndFail\n", - failHelper.testLine) - if strings.Index(output.value, header) == -1 { - c.Errorf(""+ - "Failure didn't print a proper header.\n"+ - "... Got:\n%s... Expected something with:\n%s", - output.value, header) - } -} - -func (s *FoundationS) TestFatal(c *check.C) { - var line int - defer (func() { - if !c.Failed() { - c.Error("Fatal() didn't fail the test") - } else { - c.Succeed() - expected := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Fatal(\"Die \", \"now!\")\n"+ - "... Error: Die now!\n\n", - line) - if c.GetTestLog() != expected { - c.Error("Incorrect log:", c.GetTestLog()) - } - } - })() - - line = getMyLine() + 1 - c.Fatal("Die ", "now!") - c.Log("Fatal() didn't stop the test") -} - -func (s *FoundationS) TestFatalf(c *check.C) { - var line int - defer (func() { - if !c.Failed() { - c.Error("Fatalf() didn't fail the test") - } else { - c.Succeed() - expected := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Fatalf(\"Die %%s!\", \"now\")\n"+ - "... Error: Die now!\n\n", - line) - if c.GetTestLog() != expected { - c.Error("Incorrect log:", c.GetTestLog()) - } - } - })() - - line = getMyLine() + 1 - c.Fatalf("Die %s!", "now") - c.Log("Fatalf() didn't stop the test") -} - -func (s *FoundationS) TestCallerLoggingInsideTest(c *check.C) { - log := fmt.Sprintf(""+ - "foundation_test.go:%d:\n"+ - " result := c.Check\\(10, check.Equals, 20\\)\n"+ - "\\.\\.\\. obtained int = 10\n"+ - "\\.\\.\\. expected int = 20\n\n", - getMyLine()+1) - result := c.Check(10, check.Equals, 20) - checkState(c, result, - &expectedState{ - name: "Check(10, Equals, 20)", - result: false, - failed: true, - log: log, - }) -} - -func (s *FoundationS) TestCallerLoggingInDifferentFile(c *check.C) { - result, line := checkEqualWrapper(c, 10, 20) - testLine := getMyLine() - 1 - log := fmt.Sprintf(""+ - "foundation_test.go:%d:\n"+ - " result, line := checkEqualWrapper\\(c, 10, 20\\)\n"+ - "check_test.go:%d:\n"+ - " return c.Check\\(obtained, check.Equals, expected\\), getMyLine\\(\\)\n"+ - "\\.\\.\\. obtained int = 10\n"+ - "\\.\\.\\. expected int = 20\n\n", - testLine, line) - checkState(c, result, - &expectedState{ - name: "Check(10, Equals, 20)", - result: false, - failed: true, - log: log, - }) -} - -// ----------------------------------------------------------------------- -// ExpectFailure() inverts the logic of failure. - -type ExpectFailureSucceedHelper struct{} - -func (s *ExpectFailureSucceedHelper) TestSucceed(c *check.C) { - c.ExpectFailure("It booms!") - c.Error("Boom!") -} - -type ExpectFailureFailHelper struct{} - -func (s *ExpectFailureFailHelper) TestFail(c *check.C) { - c.ExpectFailure("Bug #XYZ") -} - -func (s *FoundationS) TestExpectFailureFail(c *check.C) { - helper := ExpectFailureFailHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output}) - - expected := "" + - "^\n-+\n" + - "FAIL: foundation_test\\.go:[0-9]+:" + - " ExpectFailureFailHelper\\.TestFail\n\n" + - "\\.\\.\\. Error: Test succeeded, but was expected to fail\n" + - "\\.\\.\\. Reason: Bug #XYZ\n$" - - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("ExpectFailure() didn't log properly:\n", output.value) - } - - c.Assert(result.ExpectedFailures, check.Equals, 0) -} - -func (s *FoundationS) TestExpectFailureSucceed(c *check.C) { - helper := ExpectFailureSucceedHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output}) - - c.Assert(output.value, check.Equals, "") - c.Assert(result.ExpectedFailures, check.Equals, 1) -} - -func (s *FoundationS) TestExpectFailureSucceedVerbose(c *check.C) { - helper := ExpectFailureSucceedHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) - - expected := "" + - "FAIL EXPECTED: foundation_test\\.go:[0-9]+:" + - " ExpectFailureSucceedHelper\\.TestSucceed \\(It booms!\\)\t *[.0-9]+s\n" - - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("ExpectFailure() didn't log properly:\n", output.value) - } - - c.Assert(result.ExpectedFailures, check.Equals, 1) -} - -// ----------------------------------------------------------------------- -// Skip() allows stopping a test without positive/negative results. - -type SkipTestHelper struct{} - -func (s *SkipTestHelper) TestFail(c *check.C) { - c.Skip("Wrong platform or whatever") - c.Error("Boom!") -} - -func (s *FoundationS) TestSkip(c *check.C) { - helper := SkipTestHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - - if output.value != "" { - c.Error("Skip() logged something:\n", output.value) - } -} - -func (s *FoundationS) TestSkipVerbose(c *check.C) { - helper := SkipTestHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) - - expected := "SKIP: foundation_test\\.go:[0-9]+: SkipTestHelper\\.TestFail" + - " \\(Wrong platform or whatever\\)" - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("Skip() didn't log properly:\n", output.value) - } -} - -// ----------------------------------------------------------------------- -// Check minimum *log.Logger interface provided by *check.C. - -type minLogger interface { - Output(calldepth int, s string) error -} - -func (s *BootstrapS) TestMinLogger(c *check.C) { - var logger minLogger - logger = log.New(os.Stderr, "", 0) - logger = c - logger.Output(0, "Hello there") - expected := `\[LOG\] [0-9]+:[0-9][0-9]\.[0-9][0-9][0-9] +Hello there\n` - output := c.GetTestLog() - c.Assert(output, check.Matches, expected) -} - -// ----------------------------------------------------------------------- -// Ensure that suites with embedded types are working fine, including the -// the workaround for issue 906. - -type EmbeddedInternalS struct { - called bool -} - -type EmbeddedS struct { - EmbeddedInternalS -} - -var embeddedS = check.Suite(&EmbeddedS{}) - -func (s *EmbeddedS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *EmbeddedInternalS) TestMethod(c *check.C) { - c.Error("TestMethod() of the embedded type was called!?") -} - -func (s *EmbeddedS) TestMethod(c *check.C) { - // http://code.google.com/p/go/issues/detail?id=906 - c.Check(s.called, check.Equals, false) // Go issue 906 is affecting the runner? - s.called = true -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go deleted file mode 100644 index 4b6c26da4..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers.go +++ /dev/null @@ -1,231 +0,0 @@ -package check - -import ( - "fmt" - "strings" - "time" -) - -// TestName returns the current test name in the form "SuiteName.TestName" -func (c *C) TestName() string { - return c.testName -} - -// ----------------------------------------------------------------------- -// Basic succeeding/failing logic. - -// Failed returns whether the currently running test has already failed. -func (c *C) Failed() bool { - return c.status == failedSt -} - -// Fail marks the currently running test as failed. -// -// Something ought to have been previously logged so the developer can tell -// what went wrong. The higher level helper functions will fail the test -// and do the logging properly. -func (c *C) Fail() { - c.status = failedSt -} - -// FailNow marks the currently running test as failed and stops running it. -// Something ought to have been previously logged so the developer can tell -// what went wrong. The higher level helper functions will fail the test -// and do the logging properly. -func (c *C) FailNow() { - c.Fail() - c.stopNow() -} - -// Succeed marks the currently running test as succeeded, undoing any -// previous failures. -func (c *C) Succeed() { - c.status = succeededSt -} - -// SucceedNow marks the currently running test as succeeded, undoing any -// previous failures, and stops running the test. -func (c *C) SucceedNow() { - c.Succeed() - c.stopNow() -} - -// ExpectFailure informs that the running test is knowingly broken for -// the provided reason. If the test does not fail, an error will be reported -// to raise attention to this fact. This method is useful to temporarily -// disable tests which cover well known problems until a better time to -// fix the problem is found, without forgetting about the fact that a -// failure still exists. -func (c *C) ExpectFailure(reason string) { - if reason == "" { - panic("Missing reason why the test is expected to fail") - } - c.mustFail = true - c.reason = reason -} - -// Skip skips the running test for the provided reason. If run from within -// SetUpTest, the individual test being set up will be skipped, and if run -// from within SetUpSuite, the whole suite is skipped. -func (c *C) Skip(reason string) { - if reason == "" { - panic("Missing reason why the test is being skipped") - } - c.reason = reason - c.status = skippedSt - c.stopNow() -} - -// ----------------------------------------------------------------------- -// Basic logging. - -// GetTestLog returns the current test error output. -func (c *C) GetTestLog() string { - return c.logb.String() -} - -// Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprint. -func (c *C) Log(args ...interface{}) { - c.log(args...) -} - -// Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprintf. -func (c *C) Logf(format string, args ...interface{}) { - c.logf(format, args...) -} - -// Output enables *C to be used as a logger in functions that require only -// the minimum interface of *log.Logger. -func (c *C) Output(calldepth int, s string) error { - d := time.Now().Sub(c.startTime) - msec := d / time.Millisecond - sec := d / time.Second - min := d / time.Minute - - c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s) - return nil -} - -// Error logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprint. -func (c *C) Error(args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) - c.logNewLine() - c.Fail() -} - -// Errorf logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprintf. -func (c *C) Errorf(format string, args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprintf("Error: "+format, args...)) - c.logNewLine() - c.Fail() -} - -// Fatal logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into -// a string with fmt.Sprint. -func (c *C) Fatal(args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) - c.logNewLine() - c.FailNow() -} - -// Fatlaf logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into -// a string with fmt.Sprintf. -func (c *C) Fatalf(format string, args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...))) - c.logNewLine() - c.FailNow() -} - -// ----------------------------------------------------------------------- -// Generic checks and assertions based on checkers. - -// Check verifies if the first value matches the expected value according -// to the provided checker. If they do not match, an error is logged, the -// test is marked as failed, and the test execution continues. -// -// Some checkers may not need the expected argument (e.g. IsNil). -// -// Extra arguments provided to the function are logged next to the reported -// problem when the matching fails. -func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool { - return c.internalCheck("Check", obtained, checker, args...) -} - -// Assert ensures that the first value matches the expected value according -// to the provided checker. If they do not match, an error is logged, the -// test is marked as failed, and the test execution stops. -// -// Some checkers may not need the expected argument (e.g. IsNil). -// -// Extra arguments provided to the function are logged next to the reported -// problem when the matching fails. -func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) { - if !c.internalCheck("Assert", obtained, checker, args...) { - c.stopNow() - } -} - -func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool { - if checker == nil { - c.logCaller(2) - c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName)) - c.logString("Oops.. you've provided a nil checker!") - c.logNewLine() - c.Fail() - return false - } - - // If the last argument is a bug info, extract it out. - var comment CommentInterface - if len(args) > 0 { - if c, ok := args[len(args)-1].(CommentInterface); ok { - comment = c - args = args[:len(args)-1] - } - } - - params := append([]interface{}{obtained}, args...) - info := checker.Info() - - if len(params) != len(info.Params) { - names := append([]string{info.Params[0], info.Name}, info.Params[1:]...) - c.logCaller(2) - c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", "))) - c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1)) - c.logNewLine() - c.Fail() - return false - } - - // Copy since it may be mutated by Check. - names := append([]string{}, info.Params...) - - // Do the actual check. - result, error := checker.Check(params, names) - if !result || error != "" { - c.logCaller(2) - for i := 0; i != len(params); i++ { - c.logValue(names[i], params[i]) - } - if comment != nil { - c.logString(comment.CheckCommentString()) - } - if error != "" { - c.logString(error) - } - c.logNewLine() - c.Fail() - return false - } - return true -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers_test.go deleted file mode 100644 index 4baa656ba..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/helpers_test.go +++ /dev/null @@ -1,519 +0,0 @@ -// These tests verify the inner workings of the helper methods associated -// with check.T. - -package check_test - -import ( - "gopkg.in/check.v1" - "os" - "reflect" - "runtime" - "sync" -) - -var helpersS = check.Suite(&HelpersS{}) - -type HelpersS struct{} - -func (s *HelpersS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Fake checker and bug info to verify the behavior of Assert() and Check(). - -type MyChecker struct { - info *check.CheckerInfo - params []interface{} - names []string - result bool - error string -} - -func (checker *MyChecker) Info() *check.CheckerInfo { - if checker.info == nil { - return &check.CheckerInfo{Name: "MyChecker", Params: []string{"myobtained", "myexpected"}} - } - return checker.info -} - -func (checker *MyChecker) Check(params []interface{}, names []string) (bool, string) { - rparams := checker.params - rnames := checker.names - checker.params = append([]interface{}{}, params...) - checker.names = append([]string{}, names...) - if rparams != nil { - copy(params, rparams) - } - if rnames != nil { - copy(names, rnames) - } - return checker.result, checker.error -} - -type myCommentType string - -func (c myCommentType) CheckCommentString() string { - return string(c) -} - -func myComment(s string) myCommentType { - return myCommentType(s) -} - -// ----------------------------------------------------------------------- -// Ensure a real checker actually works fine. - -func (s *HelpersS) TestCheckerInterface(c *check.C) { - testHelperSuccess(c, "Check(1, Equals, 1)", true, func() interface{} { - return c.Check(1, check.Equals, 1) - }) -} - -// ----------------------------------------------------------------------- -// Tests for Check(), mostly the same as for Assert() following these. - -func (s *HelpersS) TestCheckSucceedWithExpected(c *check.C) { - checker := &MyChecker{result: true} - testHelperSuccess(c, "Check(1, checker, 2)", true, func() interface{} { - return c.Check(1, checker, 2) - }) - if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestCheckSucceedWithoutExpected(c *check.C) { - checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - testHelperSuccess(c, "Check(1, checker)", true, func() interface{} { - return c.Check(1, checker) - }) - if !reflect.DeepEqual(checker.params, []interface{}{1}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestCheckFailWithExpected(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Check(1, checker, 2)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -func (s *HelpersS) TestCheckFailWithExpectedAndComment(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2, myComment("Hello world!")) - }) -} - -func (s *HelpersS) TestCheckFailWithExpectedAndStaticComment(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " // Nice leading comment\\.\n" + - " return c\\.Check\\(1, checker, 2\\) // Hello there\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, - func() interface{} { - // Nice leading comment. - return c.Check(1, checker, 2) // Hello there - }) -} - -func (s *HelpersS) TestCheckFailWithoutExpected(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker\\)\n" + - "\\.+ myvalue int = 1\n\n" - testHelperFailure(c, "Check(1, checker)", false, false, log, - func() interface{} { - return c.Check(1, checker) - }) -} - -func (s *HelpersS) TestCheckFailWithoutExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myvalue int = 1\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Check(1, checker, msg)", false, false, log, - func() interface{} { - return c.Check(1, checker, myComment("Hello world!")) - }) -} - -func (s *HelpersS) TestCheckWithMissingExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker\\)\n" + - "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 2\n\n" - testHelperFailure(c, "Check(1, checker, !?)", false, false, log, - func() interface{} { - return c.Check(1, checker) - }) -} - -func (s *HelpersS) TestCheckWithTooManyExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2, 3\\)\n" + - "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 4\n\n" - testHelperFailure(c, "Check(1, checker, 2, 3)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2, 3) - }) -} - -func (s *HelpersS) TestCheckWithError(c *check.C) { - checker := &MyChecker{result: false, error: "Some not so cool data provided!"} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Some not so cool data provided!\n\n" - testHelperFailure(c, "Check(1, checker, 2)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -func (s *HelpersS) TestCheckWithNilChecker(c *check.C) { - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, nil\\)\n" + - "\\.+ Check\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + - "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" - testHelperFailure(c, "Check(obtained, nil)", false, false, log, - func() interface{} { - return c.Check(1, nil) - }) -} - -func (s *HelpersS) TestCheckWithParamsAndNamesMutation(c *check.C) { - checker := &MyChecker{result: false, params: []interface{}{3, 4}, names: []string{"newobtained", "newexpected"}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ newobtained int = 3\n" + - "\\.+ newexpected int = 4\n\n" - testHelperFailure(c, "Check(1, checker, 2) with mutation", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -// ----------------------------------------------------------------------- -// Tests for Assert(), mostly the same as for Check() above. - -func (s *HelpersS) TestAssertSucceedWithExpected(c *check.C) { - checker := &MyChecker{result: true} - testHelperSuccess(c, "Assert(1, checker, 2)", nil, func() interface{} { - c.Assert(1, checker, 2) - return nil - }) - if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestAssertSucceedWithoutExpected(c *check.C) { - checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - testHelperSuccess(c, "Assert(1, checker)", nil, func() interface{} { - c.Assert(1, checker) - return nil - }) - if !reflect.DeepEqual(checker.params, []interface{}{1}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestAssertFailWithExpected(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Assert(1, checker, 2, msg)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2, myComment("Hello world!")) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithoutExpected(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker\\)\n" + - "\\.+ myvalue int = 1\n\n" - testHelperFailure(c, "Assert(1, checker)", nil, true, log, - func() interface{} { - c.Assert(1, checker) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithoutExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myvalue int = 1\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Assert(1, checker, msg)", nil, true, log, - func() interface{} { - c.Assert(1, checker, myComment("Hello world!")) - return nil - }) -} - -func (s *HelpersS) TestAssertWithMissingExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker\\)\n" + - "\\.+ Assert\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 2\n\n" - testHelperFailure(c, "Assert(1, checker, !?)", nil, true, log, - func() interface{} { - c.Assert(1, checker) - return nil - }) -} - -func (s *HelpersS) TestAssertWithError(c *check.C) { - checker := &MyChecker{result: false, error: "Some not so cool data provided!"} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Some not so cool data provided!\n\n" - testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2) - return nil - }) -} - -func (s *HelpersS) TestAssertWithNilChecker(c *check.C) { - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, nil\\)\n" + - "\\.+ Assert\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + - "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" - testHelperFailure(c, "Assert(obtained, nil)", nil, true, log, - func() interface{} { - c.Assert(1, nil) - return nil - }) -} - -// ----------------------------------------------------------------------- -// Ensure that values logged work properly in some interesting cases. - -func (s *HelpersS) TestValueLoggingWithArrays(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\\[\\]byte{1, 2}, checker, \\[\\]byte{1, 3}\\)\n" + - "\\.+ myobtained \\[\\]uint8 = \\[\\]byte{0x1, 0x2}\n" + - "\\.+ myexpected \\[\\]uint8 = \\[\\]byte{0x1, 0x3}\n\n" - testHelperFailure(c, "Check([]byte{1}, chk, []byte{3})", false, false, log, - func() interface{} { - return c.Check([]byte{1, 2}, checker, []byte{1, 3}) - }) -} - -func (s *HelpersS) TestValueLoggingWithMultiLine(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\"a\\\\nb\\\\n\", checker, \"a\\\\nb\\\\nc\"\\)\n" + - "\\.+ myobtained string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\\\\n\"\n" + - "\\.+ myexpected string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\\\\n\" \\+\n" + - "\\.+ \"c\"\n\n" - testHelperFailure(c, `Check("a\nb\n", chk, "a\nb\nc")`, false, false, log, - func() interface{} { - return c.Check("a\nb\n", checker, "a\nb\nc") - }) -} - -func (s *HelpersS) TestValueLoggingWithMultiLineException(c *check.C) { - // If the newline is at the end of the string, don't log as multi-line. - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\"a b\\\\n\", checker, \"a\\\\nb\"\\)\n" + - "\\.+ myobtained string = \"a b\\\\n\"\n" + - "\\.+ myexpected string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\"\n\n" - testHelperFailure(c, `Check("a b\n", chk, "a\nb")`, false, false, log, - func() interface{} { - return c.Check("a b\n", checker, "a\nb") - }) -} - -// ----------------------------------------------------------------------- -// MakeDir() tests. - -type MkDirHelper struct { - path1 string - path2 string - isDir1 bool - isDir2 bool - isDir3 bool - isDir4 bool -} - -func (s *MkDirHelper) SetUpSuite(c *check.C) { - s.path1 = c.MkDir() - s.isDir1 = isDir(s.path1) -} - -func (s *MkDirHelper) Test(c *check.C) { - s.path2 = c.MkDir() - s.isDir2 = isDir(s.path2) -} - -func (s *MkDirHelper) TearDownSuite(c *check.C) { - s.isDir3 = isDir(s.path1) - s.isDir4 = isDir(s.path2) -} - -func (s *HelpersS) TestMkDir(c *check.C) { - helper := MkDirHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - c.Assert(output.value, check.Equals, "") - c.Check(helper.isDir1, check.Equals, true) - c.Check(helper.isDir2, check.Equals, true) - c.Check(helper.isDir3, check.Equals, true) - c.Check(helper.isDir4, check.Equals, true) - c.Check(helper.path1, check.Not(check.Equals), - helper.path2) - c.Check(isDir(helper.path1), check.Equals, false) - c.Check(isDir(helper.path2), check.Equals, false) -} - -func isDir(path string) bool { - if stat, err := os.Stat(path); err == nil { - return stat.IsDir() - } - return false -} - -// Concurrent logging should not corrupt the underling buffer. -// Use go test -race to detect the race in this test. -func (s *HelpersS) TestConcurrentLogging(c *check.C) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) - var start, stop sync.WaitGroup - start.Add(1) - for i, n := 0, runtime.NumCPU()*2; i < n; i++ { - stop.Add(1) - go func(i int) { - start.Wait() - for j := 0; j < 30; j++ { - c.Logf("Worker %d: line %d", i, j) - } - stop.Done() - }(i) - } - start.Done() - stop.Wait() -} - -// ----------------------------------------------------------------------- -// Test the TestName function - -type TestNameHelper struct { - name1 string - name2 string - name3 string - name4 string - name5 string -} - -func (s *TestNameHelper) SetUpSuite(c *check.C) { s.name1 = c.TestName() } -func (s *TestNameHelper) SetUpTest(c *check.C) { s.name2 = c.TestName() } -func (s *TestNameHelper) Test(c *check.C) { s.name3 = c.TestName() } -func (s *TestNameHelper) TearDownTest(c *check.C) { s.name4 = c.TestName() } -func (s *TestNameHelper) TearDownSuite(c *check.C) { s.name5 = c.TestName() } - -func (s *HelpersS) TestTestName(c *check.C) { - helper := TestNameHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - c.Check(helper.name1, check.Equals, "") - c.Check(helper.name2, check.Equals, "TestNameHelper.Test") - c.Check(helper.name3, check.Equals, "TestNameHelper.Test") - c.Check(helper.name4, check.Equals, "TestNameHelper.Test") - c.Check(helper.name5, check.Equals, "") -} - -// ----------------------------------------------------------------------- -// A couple of helper functions to test helper functions. :-) - -func testHelperSuccess(c *check.C, name string, expectedResult interface{}, closure func() interface{}) { - var result interface{} - defer (func() { - if err := recover(); err != nil { - panic(err) - } - checkState(c, result, - &expectedState{ - name: name, - result: expectedResult, - failed: false, - log: "", - }) - })() - result = closure() -} - -func testHelperFailure(c *check.C, name string, expectedResult interface{}, shouldStop bool, log string, closure func() interface{}) { - var result interface{} - defer (func() { - if err := recover(); err != nil { - panic(err) - } - checkState(c, result, - &expectedState{ - name: name, - result: expectedResult, - failed: true, - log: log, - }) - })() - result = closure() - if shouldStop { - c.Logf("%s didn't stop when it should", name) - } -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer.go deleted file mode 100644 index e0f7557b5..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer.go +++ /dev/null @@ -1,168 +0,0 @@ -package check - -import ( - "bytes" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "os" -) - -func indent(s, with string) (r string) { - eol := true - for i := 0; i != len(s); i++ { - c := s[i] - switch { - case eol && c == '\n' || c == '\r': - case c == '\n' || c == '\r': - eol = true - case eol: - eol = false - s = s[:i] + with + s[i:] - i += len(with) - } - } - return s -} - -func printLine(filename string, line int) (string, error) { - fset := token.NewFileSet() - file, err := os.Open(filename) - if err != nil { - return "", err - } - fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments) - if err != nil { - return "", err - } - config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4} - lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config} - ast.Walk(lp, fnode) - result := lp.output.Bytes() - // Comments leave \n at the end. - n := len(result) - for n > 0 && result[n-1] == '\n' { - n-- - } - return string(result[:n]), nil -} - -type linePrinter struct { - config *printer.Config - fset *token.FileSet - fnode *ast.File - line int - output bytes.Buffer - stmt ast.Stmt -} - -func (lp *linePrinter) emit() bool { - if lp.stmt != nil { - lp.trim(lp.stmt) - lp.printWithComments(lp.stmt) - lp.stmt = nil - return true - } - return false -} - -func (lp *linePrinter) printWithComments(n ast.Node) { - nfirst := lp.fset.Position(n.Pos()).Line - nlast := lp.fset.Position(n.End()).Line - for _, g := range lp.fnode.Comments { - cfirst := lp.fset.Position(g.Pos()).Line - clast := lp.fset.Position(g.End()).Line - if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column { - for _, c := range g.List { - lp.output.WriteString(c.Text) - lp.output.WriteByte('\n') - } - } - if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash { - // The printer will not include the comment if it starts past - // the node itself. Trick it into printing by overlapping the - // slash with the end of the statement. - g.List[0].Slash = n.End() - 1 - } - } - node := &printer.CommentedNode{n, lp.fnode.Comments} - lp.config.Fprint(&lp.output, lp.fset, node) -} - -func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) { - if n == nil { - if lp.output.Len() == 0 { - lp.emit() - } - return nil - } - first := lp.fset.Position(n.Pos()).Line - last := lp.fset.Position(n.End()).Line - if first <= lp.line && last >= lp.line { - // Print the innermost statement containing the line. - if stmt, ok := n.(ast.Stmt); ok { - if _, ok := n.(*ast.BlockStmt); !ok { - lp.stmt = stmt - } - } - if first == lp.line && lp.emit() { - return nil - } - return lp - } - return nil -} - -func (lp *linePrinter) trim(n ast.Node) bool { - stmt, ok := n.(ast.Stmt) - if !ok { - return true - } - line := lp.fset.Position(n.Pos()).Line - if line != lp.line { - return false - } - switch stmt := stmt.(type) { - case *ast.IfStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.SwitchStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.TypeSwitchStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.CaseClause: - stmt.Body = lp.trimList(stmt.Body) - case *ast.CommClause: - stmt.Body = lp.trimList(stmt.Body) - case *ast.BlockStmt: - stmt.List = lp.trimList(stmt.List) - } - return true -} - -func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt { - if !lp.trim(stmt) { - return lp.emptyBlock(stmt) - } - stmt.Rbrace = stmt.Lbrace - return stmt -} - -func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt { - for i := 0; i != len(stmts); i++ { - if !lp.trim(stmts[i]) { - stmts[i] = lp.emptyStmt(stmts[i]) - break - } - } - return stmts -} - -func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt { - return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}} -} - -func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt { - p := n.Pos() - return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p} -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer_test.go deleted file mode 100644 index 538b2d52e..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/printer_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package check_test - -import ( - . "gopkg.in/check.v1" -) - -var _ = Suite(&PrinterS{}) - -type PrinterS struct{} - -func (s *PrinterS) TestCountSuite(c *C) { - suitesRun += 1 -} - -var printTestFuncLine int - -func init() { - printTestFuncLine = getMyLine() + 3 -} - -func printTestFunc() { - println(1) // Comment1 - if 2 == 2 { // Comment2 - println(3) // Comment3 - } - switch 5 { - case 6: println(6) // Comment6 - println(7) - } - switch interface{}(9).(type) {// Comment9 - case int: println(10) - println(11) - } - select { - case <-(chan bool)(nil): println(14) - println(15) - default: println(16) - println(17) - } - println(19, - 20) - _ = func() { println(21) - println(22) - } - println(24, func() { - println(25) - }) - // Leading comment - // with multiple lines. - println(29) // Comment29 -} - -var printLineTests = []struct { - line int - output string -}{ - {1, "println(1) // Comment1"}, - {2, "if 2 == 2 { // Comment2\n ...\n}"}, - {3, "println(3) // Comment3"}, - {5, "switch 5 {\n...\n}"}, - {6, "case 6:\n println(6) // Comment6\n ..."}, - {7, "println(7)"}, - {9, "switch interface{}(9).(type) { // Comment9\n...\n}"}, - {10, "case int:\n println(10)\n ..."}, - {14, "case <-(chan bool)(nil):\n println(14)\n ..."}, - {15, "println(15)"}, - {16, "default:\n println(16)\n ..."}, - {17, "println(17)"}, - {19, "println(19,\n 20)"}, - {20, "println(19,\n 20)"}, - {21, "_ = func() {\n println(21)\n println(22)\n}"}, - {22, "println(22)"}, - {24, "println(24, func() {\n println(25)\n})"}, - {25, "println(25)"}, - {26, "println(24, func() {\n println(25)\n})"}, - {29, "// Leading comment\n// with multiple lines.\nprintln(29) // Comment29"}, -} - -func (s *PrinterS) TestPrintLine(c *C) { - for _, test := range printLineTests { - output, err := PrintLine("printer_test.go", printTestFuncLine+test.line) - c.Assert(err, IsNil) - c.Assert(output, Equals, test.output) - } -} - -var indentTests = []struct { - in, out string -}{ - {"", ""}, - {"\n", "\n"}, - {"a", ">>>a"}, - {"a\n", ">>>a\n"}, - {"a\nb", ">>>a\n>>>b"}, - {" ", ">>> "}, -} - -func (s *PrinterS) TestIndent(c *C) { - for _, test := range indentTests { - out := Indent(test.in, ">>>") - c.Assert(out, Equals, test.out) - } - -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run.go deleted file mode 100644 index da8fd7987..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run.go +++ /dev/null @@ -1,175 +0,0 @@ -package check - -import ( - "bufio" - "flag" - "fmt" - "os" - "testing" - "time" -) - -// ----------------------------------------------------------------------- -// Test suite registry. - -var allSuites []interface{} - -// Suite registers the given value as a test suite to be run. Any methods -// starting with the Test prefix in the given value will be considered as -// a test method. -func Suite(suite interface{}) interface{} { - allSuites = append(allSuites, suite) - return suite -} - -// ----------------------------------------------------------------------- -// Public running interface. - -var ( - oldFilterFlag = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run") - oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode") - oldStreamFlag = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)") - oldBenchFlag = flag.Bool("gocheck.b", false, "Run benchmarks") - oldBenchTime = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark") - oldListFlag = flag.Bool("gocheck.list", false, "List the names of all tests that will be run") - oldWorkFlag = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") - - newFilterFlag = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run") - newVerboseFlag = flag.Bool("check.v", false, "Verbose mode") - newStreamFlag = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)") - newBenchFlag = flag.Bool("check.b", false, "Run benchmarks") - newBenchTime = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark") - newBenchMem = flag.Bool("check.bmem", false, "Report memory benchmarks") - newListFlag = flag.Bool("check.list", false, "List the names of all tests that will be run") - newWorkFlag = flag.Bool("check.work", false, "Display and do not remove the test working directory") -) - -// TestingT runs all test suites registered with the Suite function, -// printing results to stdout, and reporting any failures back to -// the "testing" package. -func TestingT(testingT *testing.T) { - benchTime := *newBenchTime - if benchTime == 1*time.Second { - benchTime = *oldBenchTime - } - conf := &RunConf{ - Filter: *oldFilterFlag + *newFilterFlag, - Verbose: *oldVerboseFlag || *newVerboseFlag, - Stream: *oldStreamFlag || *newStreamFlag, - Benchmark: *oldBenchFlag || *newBenchFlag, - BenchmarkTime: benchTime, - BenchmarkMem: *newBenchMem, - KeepWorkDir: *oldWorkFlag || *newWorkFlag, - } - if *oldListFlag || *newListFlag { - w := bufio.NewWriter(os.Stdout) - for _, name := range ListAll(conf) { - fmt.Fprintln(w, name) - } - w.Flush() - return - } - result := RunAll(conf) - println(result.String()) - if !result.Passed() { - testingT.Fail() - } -} - -// RunAll runs all test suites registered with the Suite function, using the -// provided run configuration. -func RunAll(runConf *RunConf) *Result { - result := Result{} - for _, suite := range allSuites { - result.Add(Run(suite, runConf)) - } - return &result -} - -// Run runs the provided test suite using the provided run configuration. -func Run(suite interface{}, runConf *RunConf) *Result { - runner := newSuiteRunner(suite, runConf) - return runner.run() -} - -// ListAll returns the names of all the test functions registered with the -// Suite function that will be run with the provided run configuration. -func ListAll(runConf *RunConf) []string { - var names []string - for _, suite := range allSuites { - names = append(names, List(suite, runConf)...) - } - return names -} - -// List returns the names of the test functions in the given -// suite that will be run with the provided run configuration. -func List(suite interface{}, runConf *RunConf) []string { - var names []string - runner := newSuiteRunner(suite, runConf) - for _, t := range runner.tests { - names = append(names, t.String()) - } - return names -} - -// ----------------------------------------------------------------------- -// Result methods. - -func (r *Result) Add(other *Result) { - r.Succeeded += other.Succeeded - r.Skipped += other.Skipped - r.Failed += other.Failed - r.Panicked += other.Panicked - r.FixturePanicked += other.FixturePanicked - r.ExpectedFailures += other.ExpectedFailures - r.Missed += other.Missed - if r.WorkDir != "" && other.WorkDir != "" { - r.WorkDir += ":" + other.WorkDir - } else if other.WorkDir != "" { - r.WorkDir = other.WorkDir - } -} - -func (r *Result) Passed() bool { - return (r.Failed == 0 && r.Panicked == 0 && - r.FixturePanicked == 0 && r.Missed == 0 && - r.RunError == nil) -} - -func (r *Result) String() string { - if r.RunError != nil { - return "ERROR: " + r.RunError.Error() - } - - var value string - if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 && - r.Missed == 0 { - value = "OK: " - } else { - value = "OOPS: " - } - value += fmt.Sprintf("%d passed", r.Succeeded) - if r.Skipped != 0 { - value += fmt.Sprintf(", %d skipped", r.Skipped) - } - if r.ExpectedFailures != 0 { - value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures) - } - if r.Failed != 0 { - value += fmt.Sprintf(", %d FAILED", r.Failed) - } - if r.Panicked != 0 { - value += fmt.Sprintf(", %d PANICKED", r.Panicked) - } - if r.FixturePanicked != 0 { - value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked) - } - if r.Missed != 0 { - value += fmt.Sprintf(", %d MISSED", r.Missed) - } - if r.WorkDir != "" { - value += "\nWORK=" + r.WorkDir - } - return value -} diff --git a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run_test.go b/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run_test.go deleted file mode 100644 index f41fffc3f..000000000 --- a/pkg/api/Godeps/_workspace/src/gopkg.in/check.v1/run_test.go +++ /dev/null @@ -1,419 +0,0 @@ -// These tests verify the test running logic. - -package check_test - -import ( - "errors" - . "gopkg.in/check.v1" - "os" - "sync" -) - -var runnerS = Suite(&RunS{}) - -type RunS struct{} - -func (s *RunS) TestCountSuite(c *C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Tests ensuring result counting works properly. - -func (s *RunS) TestSuccess(c *C) { - output := String{} - result := Run(&SuccessHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 1) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestFailure(c *C) { - output := String{} - result := Run(&FailHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 1) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestFixture(c *C) { - output := String{} - result := Run(&FixtureHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 2) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnTest(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "Test1"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 1) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 1) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnSetUpTest(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "SetUpTest"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 1) - c.Check(result.Missed, Equals, 2) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnSetUpSuite(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "SetUpSuite"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 1) - c.Check(result.Missed, Equals, 2) - c.Check(result.RunError, IsNil) -} - -// ----------------------------------------------------------------------- -// Check result aggregation. - -func (s *RunS) TestAdd(c *C) { - result := &Result{ - Succeeded: 1, - Skipped: 2, - Failed: 3, - Panicked: 4, - FixturePanicked: 5, - Missed: 6, - ExpectedFailures: 7, - } - result.Add(&Result{ - Succeeded: 10, - Skipped: 20, - Failed: 30, - Panicked: 40, - FixturePanicked: 50, - Missed: 60, - ExpectedFailures: 70, - }) - c.Check(result.Succeeded, Equals, 11) - c.Check(result.Skipped, Equals, 22) - c.Check(result.Failed, Equals, 33) - c.Check(result.Panicked, Equals, 44) - c.Check(result.FixturePanicked, Equals, 55) - c.Check(result.Missed, Equals, 66) - c.Check(result.ExpectedFailures, Equals, 77) - c.Check(result.RunError, IsNil) -} - -// ----------------------------------------------------------------------- -// Check the Passed() method. - -func (s *RunS) TestPassed(c *C) { - c.Assert((&Result{}).Passed(), Equals, true) - c.Assert((&Result{Succeeded: 1}).Passed(), Equals, true) - c.Assert((&Result{Skipped: 1}).Passed(), Equals, true) - c.Assert((&Result{Failed: 1}).Passed(), Equals, false) - c.Assert((&Result{Panicked: 1}).Passed(), Equals, false) - c.Assert((&Result{FixturePanicked: 1}).Passed(), Equals, false) - c.Assert((&Result{Missed: 1}).Passed(), Equals, false) - c.Assert((&Result{RunError: errors.New("!")}).Passed(), Equals, false) -} - -// ----------------------------------------------------------------------- -// Check that result printing is working correctly. - -func (s *RunS) TestPrintSuccess(c *C) { - result := &Result{Succeeded: 5} - c.Check(result.String(), Equals, "OK: 5 passed") -} - -func (s *RunS) TestPrintFailure(c *C) { - result := &Result{Failed: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FAILED") -} - -func (s *RunS) TestPrintSkipped(c *C) { - result := &Result{Skipped: 5} - c.Check(result.String(), Equals, "OK: 0 passed, 5 skipped") -} - -func (s *RunS) TestPrintExpectedFailures(c *C) { - result := &Result{ExpectedFailures: 5} - c.Check(result.String(), Equals, "OK: 0 passed, 5 expected failures") -} - -func (s *RunS) TestPrintPanicked(c *C) { - result := &Result{Panicked: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 PANICKED") -} - -func (s *RunS) TestPrintFixturePanicked(c *C) { - result := &Result{FixturePanicked: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE-PANICKED") -} - -func (s *RunS) TestPrintMissed(c *C) { - result := &Result{Missed: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 MISSED") -} - -func (s *RunS) TestPrintAll(c *C) { - result := &Result{Succeeded: 1, Skipped: 2, ExpectedFailures: 3, - Panicked: 4, FixturePanicked: 5, Missed: 6} - c.Check(result.String(), Equals, - "OOPS: 1 passed, 2 skipped, 3 expected failures, 4 PANICKED, "+ - "5 FIXTURE-PANICKED, 6 MISSED") -} - -func (s *RunS) TestPrintRunError(c *C) { - result := &Result{Succeeded: 1, Failed: 1, - RunError: errors.New("Kaboom!")} - c.Check(result.String(), Equals, "ERROR: Kaboom!") -} - -// ----------------------------------------------------------------------- -// Verify that the method pattern flag works correctly. - -func (s *RunS) TestFilterTestName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "Test[91]"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) -} - -func (s *RunS) TestFilterTestNameWithAll(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: ".*"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterSuiteName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "FixtureHelper"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterSuiteNameAndTestName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "FixtureHelper\\.Test2"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test2") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) -} - -func (s *RunS) TestFilterAllOut(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "NotFound"} - Run(&helper, &runConf) - c.Check(len(helper.calls), Equals, 0) -} - -func (s *RunS) TestRequirePartialMatch(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "est"} - Run(&helper, &runConf) - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterError(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "]["} - result := Run(&helper, &runConf) - c.Check(result.String(), Equals, - "ERROR: Bad filter expression: error parsing regexp: missing closing ]: `[`") - c.Check(len(helper.calls), Equals, 0) -} - -// ----------------------------------------------------------------------- -// Verify that List works correctly. - -func (s *RunS) TestListFiltered(c *C) { - names := List(&FixtureHelper{}, &RunConf{Filter: "1"}) - c.Assert(names, DeepEquals, []string{ - "FixtureHelper.Test1", - }) -} - -func (s *RunS) TestList(c *C) { - names := List(&FixtureHelper{}, &RunConf{}) - c.Assert(names, DeepEquals, []string{ - "FixtureHelper.Test1", - "FixtureHelper.Test2", - }) -} - -// ----------------------------------------------------------------------- -// Verify that verbose mode prints tests which pass as well. - -func (s *RunS) TestVerboseMode(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t *[.0-9]+s\n" + - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" - - c.Assert(output.value, Matches, expected) -} - -func (s *RunS) TestVerboseModeWithFailBeforePass(c *C) { - helper := FixtureHelper{panicOn: "Test1"} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "(?s).*PANIC.*\n-+\n" + // Should have an extra line. - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" - - c.Assert(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Verify the stream output mode. In this mode there's no output caching. - -type StreamHelper struct { - l2 sync.Mutex - l3 sync.Mutex -} - -func (s *StreamHelper) SetUpSuite(c *C) { - c.Log("0") -} - -func (s *StreamHelper) Test1(c *C) { - c.Log("1") - s.l2.Lock() - s.l3.Lock() - go func() { - s.l2.Lock() // Wait for "2". - c.Log("3") - s.l3.Unlock() - }() -} - -func (s *StreamHelper) Test2(c *C) { - c.Log("2") - s.l2.Unlock() - s.l3.Lock() // Wait for "3". - c.Fail() - c.Log("4") -} - -func (s *RunS) TestStreamMode(c *C) { - helper := &StreamHelper{} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(helper, &runConf) - - expected := "START: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\n0\n" + - "PASS: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\t *[.0-9]+s\n\n" + - "START: run_test\\.go:[0-9]+: StreamHelper\\.Test1\n1\n" + - "PASS: run_test\\.go:[0-9]+: StreamHelper\\.Test1\t *[.0-9]+s\n\n" + - "START: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n2\n3\n4\n" + - "FAIL: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n\n" - - c.Assert(output.value, Matches, expected) -} - -type StreamMissHelper struct{} - -func (s *StreamMissHelper) SetUpSuite(c *C) { - c.Log("0") - c.Fail() -} - -func (s *StreamMissHelper) Test1(c *C) { - c.Log("1") -} - -func (s *RunS) TestStreamModeWithMiss(c *C) { - helper := &StreamMissHelper{} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(helper, &runConf) - - expected := "START: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n0\n" + - "FAIL: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n\n" + - "START: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n" + - "MISS: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n\n" - - c.Assert(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Verify that that the keep work dir request indeed does so. - -type WorkDirSuite struct {} - -func (s *WorkDirSuite) Test(c *C) { - c.MkDir() -} - -func (s *RunS) TestKeepWorkDir(c *C) { - output := String{} - runConf := RunConf{Output: &output, Verbose: true, KeepWorkDir: true} - result := Run(&WorkDirSuite{}, &runConf) - - c.Assert(result.String(), Matches, ".*\nWORK=" + result.WorkDir) - - stat, err := os.Stat(result.WorkDir) - c.Assert(err, IsNil) - c.Assert(stat.IsDir(), Equals, true) -}